• 音视频包的pts,dts,duration的由来.


    音视频包的pts,dts,duration的由来.

    pts: 演播时间戳

    dts:解码时间戳

    duration:播放时长

    怎样深刻理解这些概念,它们具体代表了什么? 通过具体实例和数据来理解.

    包pts:
    对于视频包pts, 并不是线性递长的,而是会有浮动, 例如.
    以下前12个视频压缩包.
    packet count:1 ,stream_index:0,packet_vcount:1,packet_acount:0,pts:133200
    packet count:2 ,stream_index:0,packet_vcount:2,packet_acount:0,pts:147600
    packet count:3 ,stream_index:0,packet_vcount:3,packet_acount:0,pts:140400
    packet count:10 ,stream_index:0,packet_vcount:4,packet_acount:6,pts:136800
    packet count:11 ,stream_index:0,packet_vcount:5,packet_acount:6,pts:144000
    packet count:12 ,stream_index:0,packet_vcount:6,packet_acount:6,pts:162000
    packet count:13 ,stream_index:0,packet_vcount:7,packet_acount:6,pts:154800
    packet count:22 ,stream_index:0,packet_vcount:8,packet_acount:14,pts:151200
    packet count:23 ,stream_index:0,packet_vcount:9,packet_acount:14,pts:158400
    packet count:24 ,stream_index:0,packet_vcount:10,packet_acount:14,pts:176400
    packet count:25 ,stream_index:0,packet_vcount:11,packet_acount:14,pts:169200
    packet count:26 ,stream_index:0,packet_vcount:12,packet_acount:14,pts:165600
    其浮动规律:14400,-7200,-3600,7200,18000,-7200,-3600,7200,18000,-7200,-3600
    其实,视频包的duration都是3600.

    对于音频包pts, 是线性递长的,例如:
    以下14个音频压缩包,每一包pts比前一包多1920, 每一个音频包的duraton是1920
    packet count:4 ,stream_index:1,packet_vcount:3,packet_acount:1,pts:131280
    packet count:5 ,stream_index:1,packet_vcount:3,packet_acount:2,pts:133200
    packet count:6 ,stream_index:1,packet_vcount:3,packet_acount:3,pts:135120
    packet count:7 ,stream_index:1,packet_vcount:3,packet_acount:4,pts:137040
    packet count:8 ,stream_index:1,packet_vcount:3,packet_acount:5,pts:138960
    packet count:9 ,stream_index:1,packet_vcount:3,packet_acount:6,pts:140880
    packet count:14 ,stream_index:1,packet_vcount:7,packet_acount:7,pts:142800
    packet count:15 ,stream_index:1,packet_vcount:7,packet_acount:8,pts:144720
    packet count:16 ,stream_index:1,packet_vcount:7,packet_acount:9,pts:146640
    packet count:17 ,stream_index:1,packet_vcount:7,packet_acount:10,pts:148560
    packet count:18 ,stream_index:1,packet_vcount:7,packet_acount:11,pts:150480
    packet count:19 ,stream_index:1,packet_vcount:7,packet_acount:12,pts:152400
    packet count:20 ,stream_index:1,packet_vcount:7,packet_acount:13,pts:154320
    packet count:21 ,stream_index:1,packet_vcount:7,packet_acount:14,pts:156240
    音频流的采样率.

    并且第4个音频包pts:131280比第3个视频包pts:140400 小,但第9个音频包pts140880比第3个视频包大.
    第10个视频包pts:136800比第3个视频包pts:140400 还小,比第9个音频包pts也小,但第11个视频包pts就又长上去了.


    对于压缩的包,应该看dts. 我们看到视频包也是线性递长的,每次长3600, 这样看着就顺了!!
    音频包的dts就等于pts
    packet count:1 ,stream_index:0,packet_vcount:1,packet_acount:0,dts:126000,duration:3600
    packet count:2 ,stream_index:0,packet_vcount:2,packet_acount:0,dts:129600,duration:3600
    packet count:3 ,stream_index:0,packet_vcount:3,packet_acount:0,dts:133200,duration:3600
    packet count:4 ,stream_index:1,packet_vcount:3,packet_acount:1,dts:131280,duration:1920
    packet count:5 ,stream_index:1,packet_vcount:3,packet_acount:2,dts:133200,duration:1920
    packet count:6 ,stream_index:1,packet_vcount:3,packet_acount:3,dts:135120,duration:1920
    packet count:7 ,stream_index:1,packet_vcount:3,packet_acount:4,dts:137040,duration:1920
    packet count:8 ,stream_index:1,packet_vcount:3,packet_acount:5,dts:138960,duration:1920
    packet count:9 ,stream_index:1,packet_vcount:3,packet_acount:6,dts:140880,duration:1920
    packet count:10 ,stream_index:0,packet_vcount:4,packet_acount:6,dts:136800,duration:3600
    packet count:11 ,stream_index:0,packet_vcount:5,packet_acount:6,dts:140400,duration:3600
    packet count:12 ,stream_index:0,packet_vcount:6,packet_acount:6,dts:144000,duration:3600
    packet count:13 ,stream_index:0,packet_vcount:7,packet_acount:6,dts:147600,duration:3600
    packet count:14 ,stream_index:1,packet_vcount:7,packet_acount:7,dts:142800,duration:1920
    packet count:15 ,stream_index:1,packet_vcount:7,packet_acount:8,dts:144720,duration:1920
    packet count:16 ,stream_index:1,packet_vcount:7,packet_acount:9,dts:146640,duration:1920
    packet count:17 ,stream_index:1,packet_vcount:7,packet_acount:10,dts:148560,duration:1920
    packet count:18 ,stream_index:1,packet_vcount:7,packet_acount:11,dts:150480,duration:1920
    packet count:19 ,stream_index:1,packet_vcount:7,packet_acount:12,dts:152400,duration:1920
    packet count:20 ,stream_index:1,packet_vcount:7,packet_acount:13,dts:154320,duration:1920
    packet count:21 ,stream_index:1,packet_vcount:7,packet_acount:14,dts:156240,duration:1920

    视频包duration=3600的由来
    视频包的r_frame_rate, 从视频流信息中获取(ctx中有)m_fmt_ctx->streams[m_video_stream_index]->r_frame_rate=(25,1)
    视频包的time_base, 从视频流信息中获取(ctx中有)m_fmt_ctx->streams[m_video_stream_index]->time_base=(1,90000)
    则一帧的时间1/25 = 0.04s = 40ms
    转换为视频包时基pts = 0.04 * 90000 = 40*90=3600

    音频包duration=1920的由来
    音频包的采样率(sample_rate): 由音频流信息(ctx中有)m_fmt_ctx->streams[m_audio_stream_index]->codecpar->sample_rate获取 48000
    音频包的大小(frame_size): 由音频流信息(ctx中有)m_fmt_ctx->streams[m_audio_stream_index]->codecpar->frame_size获取 1024
    音频包的time_base: 由音频流信息(ctx中有)m_fmt_ctx->streams[m_audio_stream_index]->time_base获取(1,90000)
    则一音频包的时间: 1024/48000=0.0213秒
    用时基表示时间: 1024/48000*90000=1920

    pts 是何时使用呢? 这要把packet压缩包解码成frame 之后, 解出的frame 就是按pts 依次递长排列的了, 将每个frame依次播放就是视频.
    附上一段测试数据供参考.
    packet count:1 ,stream_index:0,packet_vcount:1,packet_acount:0,pts:133200,dts:126000,duration:3600,size:25709
    packet count:2 ,stream_index:0,packet_vcount:2,packet_acount:0,pts:147600,dts:129600,duration:3600,size:9433
    packet count:3 ,stream_index:0,packet_vcount:3,packet_acount:0,pts:140400,dts:133200,duration:3600,size:3912
    frame count:1 ,frametype:v,frame_vcount:1,frame_acount:0,pts:133200,pkt_size:25709
    packet count:4 ,stream_index:1,packet_vcount:3,packet_acount:1,pts:131280,dts:131280,duration:1920,size:69
    frame count:2 ,frametype:a,frame_vcount:1,frame_acount:1,pts:131280,pkt_size:69
    packet count:5 ,stream_index:1,packet_vcount:3,packet_acount:2,pts:133200,dts:133200,duration:1920,size:425
    frame count:3 ,frametype:a,frame_vcount:1,frame_acount:2,pts:133200,pkt_size:425
    packet count:6 ,stream_index:1,packet_vcount:3,packet_acount:3,pts:135120,dts:135120,duration:1920,size:830
    frame count:4 ,frametype:a,frame_vcount:1,frame_acount:3,pts:135120,pkt_size:830
    packet count:7 ,stream_index:1,packet_vcount:3,packet_acount:4,pts:137040,dts:137040,duration:1920,size:427
    frame count:5 ,frametype:a,frame_vcount:1,frame_acount:4,pts:137040,pkt_size:427
    packet count:8 ,stream_index:1,packet_vcount:3,packet_acount:5,pts:138960,dts:138960,duration:1920,size:424
    frame count:6 ,frametype:a,frame_vcount:1,frame_acount:5,pts:138960,pkt_size:424
    packet count:9 ,stream_index:1,packet_vcount:3,packet_acount:6,pts:140880,dts:140880,duration:1920,size:410
    frame count:7 ,frametype:a,frame_vcount:1,frame_acount:6,pts:140880,pkt_size:410
    packet count:10 ,stream_index:0,packet_vcount:4,packet_acount:6,pts:136800,dts:136800,duration:3600,size:2727
    frame count:8 ,frametype:v,frame_vcount:2,frame_acount:6,pts:136800,pkt_size:2727
    packet count:11 ,stream_index:0,packet_vcount:5,packet_acount:6,pts:144000,dts:140400,duration:3600,size:2576
    frame count:9 ,frametype:v,frame_vcount:3,frame_acount:6,pts:140400,pkt_size:3912
    packet count:12 ,stream_index:0,packet_vcount:6,packet_acount:6,pts:162000,dts:144000,duration:3600,size:8391
    frame count:10 ,frametype:v,frame_vcount:4,frame_acount:6,pts:144000,pkt_size:2576
    packet count:13 ,stream_index:0,packet_vcount:7,packet_acount:6,pts:154800,dts:147600,duration:3600,size:3486
    frame count:11 ,frametype:v,frame_vcount:5,frame_acount:6,pts:147600,pkt_size:9433
    packet count:14 ,stream_index:1,packet_vcount:7,packet_acount:7,pts:142800,dts:142800,duration:1920,size:388
    frame count:12 ,frametype:a,frame_vcount:5,frame_acount:7,pts:142800,pkt_size:388

  • 相关阅读:
    awk实战演练
    澳大利亚博士后招聘|国立大学—太阳能电池方向
    sqoop-import 详解
    centos7 离线部署Chrome 117,并配置chromedriver
    数据库函数依赖
    Android11 有线网Score分析流程
    医学图像处理——DeepDrr工具CT生成DRR
    广州蓝景分享—谈谈JavaScript 的对象复制
    Golang Map的使用
    8.4 使用二叉树的排序算法*8.5 小结
  • 原文地址:https://blog.csdn.net/hejinjing_tom_com/article/details/125614716