16shots 2024-02-28 13:41 采纳率: 0%
浏览 5

ffmpeg将某mp4文件转为带B帧的mp4文件,为什么得到的文件中B帧的pts和dts顺序没有差异?

ffmpeg将某mp4文件转为带B帧的mp4文件,为什么得到的文件中IPB帧的pts和dts大小顺序没有差异?

ffmpeg -i test.mp4 -vcodec libx264 -bf 4 test2_8.mp4

D:\myWorkStore\>ffprobe -v quiet -show_frames -select_streams v test2_8.mp4  | find "pict_type="
pict_type=I
pict_type=B
pict_type=B
pict_type=B
pict_type=P
pict_type=B
pict_type=B
pict_type=B
pict_type=P
pict_type=B
pict_type=B
pict_type=B
pict_type=P
pict_type=B
pict_type=B
pict_type=B
pict_type=P
pict_type=B
pict_type=B
pict_type=B
pict_type=P
pict_type=B
pict_type=B
pict_type=B
pict_type=P
.....

如下,B帧的pts和dts大小顺序结果一致,为什么dts不是先解码IP帧再B帧的顺序呢?

ffprobe -v quiet -show_frames -select_streams v test2_8.mp4 | findstr /i "pict_type= dts pts"
pkt_pts=0
pkt_pts_time=0.000000
pkt_dts=0
pkt_dts_time=0.000000
pict_type=I
pkt_pts=1024
pkt_pts_time=0.100000
pkt_dts=1024
pkt_dts_time=0.100000
pict_type=B
pkt_pts=2048
pkt_pts_time=0.200000
pkt_dts=2048
pkt_dts_time=0.200000
pict_type=B
pkt_pts=3072
pkt_pts_time=0.300000
pkt_dts=3072
pkt_dts_time=0.300000
pict_type=B
pkt_pts=4096
pkt_pts_time=0.400000
pkt_dts=4096
pkt_dts_time=0.400000
pict_type=P
pkt_pts=5120
pkt_pts_time=0.500000
pkt_dts=5120
pkt_dts_time=0.500000
pict_type=B
pkt_pts=6144
pkt_pts_time=0.600000
pkt_dts=6144
pkt_dts_time=0.600000
pict_type=B
pkt_pts=7168
pkt_pts_time=0.700000
pkt_dts=7168
pkt_dts_time=0.700000
pict_type=B
pkt_pts=8192
pkt_pts_time=0.800000
pkt_dts=8192
pkt_dts_time=0.800000
pict_type=P
pkt_pts=9216
pkt_pts_time=0.900000
pkt_dts=9216
pkt_dts_time=0.900000
pict_type=B
pkt_pts=10240
pkt_pts_time=1.000000
pkt_dts=10240
pkt_dts_time=1.000000
pict_type=B
pkt_pts=11264
pkt_pts_time=1.100000
pkt_dts=11264
pkt_dts_time=1.100000
pict_type=B
pkt_pts=12288
pkt_pts_time=1.200000
pkt_dts=12288
pkt_dts_time=1.200000
pict_type=P
pkt_pts=13312
pkt_pts_time=1.300000
pkt_dts=13312
pkt_dts_time=1.300000
pict_type=B
pkt_pts=14336
pkt_pts_time=1.400000
pkt_dts=14336
pkt_dts_time=1.400000
pict_type=B
pkt_pts=15360
pkt_pts_time=1.500000
pkt_dts=15360
pkt_dts_time=1.500000
pict_type=B
pkt_pts=16384
pkt_pts_time=1.600000
pkt_dts=16384
pkt_dts_time=1.600000
pict_type=P
pkt_pts=17408
pkt_pts_time=1.700000
pkt_dts=17408
pkt_dts_time=1.700000
pict_type=B
pkt_pts=18432
pkt_pts_time=1.800000
pkt_dts=18432
pkt_dts_time=1.800000
pict_type=B
pkt_pts=19456
pkt_pts_time=1.900000
pkt_dts=19456
pkt_dts_time=1.900000
pict_type=B
pkt_pts=20480
pkt_pts_time=2.000000
pkt_dts=20480
pkt_dts_time=2.000000
pict_type=P
pkt_pts=21504
pkt_pts_time=2.100000
pkt_dts=21504
pkt_dts_time=2.100000
pict_type=B
pkt_pts=22528
pkt_pts_time=2.200000
pkt_dts=22528
pkt_dts_time=2.200000
pict_type=B
pkt_pts=23552
pkt_pts_time=2.300000
pkt_dts=23552
pkt_dts_time=2.300000
pict_type=B
pkt_pts=24576
pkt_pts_time=2.400000
pkt_dts=24576
pkt_dts_time=2.400000
pict_type=P
pkt_pts=25600
pkt_pts_time=2.500000
pkt_dts=25600
pkt_dts_time=2.500000
pict_type=B
pkt_pts=26624
pkt_pts_time=2.600000
pkt_dts=26624
pkt_dts_time=2.600000
pict_type=B
pkt_pts=27648
pkt_pts_time=2.700000
pkt_dts=27648
pkt_dts_time=2.700000
pict_type=B
pkt_pts=28672
pkt_pts_time=2.800000
pkt_dts=28672
pkt_dts_time=2.800000
pict_type=P
pkt_pts=29696
pkt_pts_time=2.900000
pkt_dts=29696
pkt_dts_time=2.900000
pict_type=B
pkt_pts=30720
pkt_pts_time=3.000000
pkt_dts=30720
pkt_dts_time=3.000000
pict_type=B
pkt_pts=31744
pkt_pts_time=3.100000
pkt_dts=31744
pkt_dts_time=3.100000
pict_type=B
pkt_pts=32768
pkt_pts_time=3.200000
pkt_dts=32768
pkt_dts_time=3.200000
pict_type=P
pkt_pts=33792
pkt_pts_time=3.300000
pkt_dts=33792
pkt_dts_time=3.300000
pict_type=B

  • 写回答

1条回答 默认 最新

  • 关注

    16shots 下午好🌅🌅🌅
    本答案参考通义千问

    原因分析: FFmpeg在生成H.264编码的MP4文件时,采用了时间同步(Timestamp Synchronization)机制,确保了帧的播放顺序和解码顺序的一致性。即使包含B-frames(双向预测帧),PTS(Presentation Time Stamp)和DTS(Decode Time Stamp)的设置也是为了保证视频流的连续性和正确播放。B-frames依赖于前面的帧(I-frames或P-frames)进行预测,因此它们的DTS通常会晚于其依赖的帧。

    解决方案:

    1. **理解B帧的工作原理:**B-frames是利用前后帧的信息进行编码的,它们的解码依赖于I或P帧,所以DTS会在I/P帧之后。
    2. **检查工具输出:**ffprobe显示的DTS和PTS确实表明了B帧是在相应I帧或P帧之后被解码的。
    3. **确认编码过程:**使用ffmpeg的-hide_banner参数可以隐藏冗长的输出,只查看关键信息,如 -i input.mp4 -c:v libx264 -bf 4 -hide_banner output.mp4
    4. 检查编码配置:-bf选项用于启用B帧,如果将其值设置得过大,可能会导致B帧的插入顺序与PTS/DTS不一致,但在这个例子中,你设置了-bf 4,应该不会影响基本的B帧顺序。

    总结: 由于H.264编码的特性以及FFmpeg的编解码处理,B帧的DTS通常会跟随其依赖的I帧或P帧,而不是提前。这是为了保持视频流的正确播放顺序。你的ffprobe输出显示了这种行为,因此不必担心B帧的DTS和PTS顺序问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月28日

悬赏问题

  • ¥15 为什么跑这个代码,文件显示不在呀
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?