我有一个基于libav的工作程序(或者ffmpeg - 专业知识在这里有用)。
它需要一个 mp4 视频,用 h264 视频/AAC 音频编码,然后将其重新混合为 MPEG TS 并将其分段为 X 秒块。它类似于以下 ffmpeg 命令:
ffmpeg -y -i video.mp4 -c:a copy -bsf:a aac_adtstoasc -c:v copy -bsf:v h264_mp4toannexb -flags -global_header -map 0 -f segment -segment_time 10 -segment_list playlist.m3u8 -segment_format mpegts chunk_%03d.ts
我不使用命令行的原因是我希望只生成段的一个子集。因此,如果视频产生 8 到 12 秒之间的 10 个片段(由于关键帧,这些片段永远不是所需的长度),我可能希望稍后生成 3-7 片段。
我的程序的完整代码可以在这里找到。
我用来av_read_frame
从源文件中读取每一帧,remux(包括位过滤器进程)并写入输出文件。一旦自上次输出以来的持续时间变得接近/大于所需的段长度,我刷新输出文件,关闭它,打开下一个段并继续。
我尝试更改代码以执行av_seek_frame
到第一段的末尾并从那里开始(我也尝试从第二段和第三段的末尾开始)。新段的长度相同(以秒和 pts 为单位),但与完整运行中的可比较段(在几千字节内)具有不同的大小 - 起始段(无论是第二个、第三个还是其他)也显示为比以前的可比段少 2 个数据包。
我认为这av_seek_frame
会给我一个完全匹配的结果,就好像我已经手动完成了一个av_read_frame
直到该帧的循环,但似乎情况并非如此。
我的愿望:
- 一种在文件中“快进”到文件中特定(非近似)点的方法。
- 要从该点向前写入并使输出与完整运行提供的输出完全相同(相同大小、相同长度、相同精确字节)。