我尝试使用 libavformat 创建.mp4具有单个 h.264 视频流的视频,但生成的文件中的最后一帧的持续时间通常为零,并且实际上从视频中删除。奇怪的是,最终帧是否被丢弃取决于我尝试添加到文件中的帧数。我在下面概述的一些简单测试让我认为我在某种程度上错误配置了AVFormatContexth.264 编码器,导致两个编辑列表有时会截断最终帧。我还将发布我正在使用的代码的简化版本,以防我犯一些明显的错误。任何帮助将不胜感激:过去几天我一直在努力解决这个问题,但进展甚微。
ffmpeg
如果我使用该选项,我可以通过使用带有复制编解码器的二进制文件创建一个新的 mp4 容器来恢复丢失的帧-ignore_editlist。ffprobe使用、mp4trackdump、 或来检查丢失帧的文件mp4file --dump表明,如果最终帧的采样时间与编辑列表末尾完全相同,则最终帧将被丢弃。当我制作一个没有丢帧的文件时,它仍然有两个编辑列表:唯一的区别是编辑列表的结束时间超出了没有丢帧的文件中的所有样本。虽然这不是一个公平的比较,但如果我.png为每个帧创建一个,然后使用编解码器和类似的 h.264 设置生成一个.mp4,ffmpeg我image2会制作一部包含所有帧的电影,只有一个编辑列表,以及与我的类似的 PTS 时间带有两个编辑列表的损坏的电影。在这种情况下,编辑列表始终在最后一帧/采样时间之后结束。
我使用此命令来确定结果流中的帧数,尽管我也通过其他实用程序获得相同的数字:
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 video_file_name.mp4
Run Code Online (Sandbox Code Playgroud)
使用 ffprobe 对文件进行简单检查,除了帧速率受到丢失帧的影响(目标为 24)之外,没有显示出明显令人担忧的迹象:
$ ffprobe -hide_banner testing.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'testing.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.45.100
Duration: 00:00:04.13, start: 0.041016, bitrate: 724 kb/s …Run Code Online (Sandbox Code Playgroud)