首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只分割视频文件的部分,输出没有差别。

只分割视频文件的部分,输出没有差别。
EN

Stack Overflow用户
提问于 2013-06-19 13:40:10
回答 2查看 667关注 0票数 1

我有一个建立在利巴夫之上的工作程序(或者ffmpeg -专门知识在这里是有用的)。

它使用一个mp4视频,用h264视频/ AAC音频编码,并将其重新修改为MPEG TS,并将其分割为X秒块。它类似于以下ffmpeg命令:

代码语言:javascript
复制
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,然后从第一段开始(我还试图在第2段和第3段结束时开始)。新段的长度(以秒和秒为单位)是相同的,但与完全贯通段(在几千字节内)的可比段大小不同--起始段(无论是第2段、第3段还是其他部分)还显示出比以前的可比段少了2个包。

我假设av_seek_frame会给我一个精确的匹配,就好像我已经用av_read_frame手动完成了一个循环,直到那个框架,但情况似乎并非如此。

我的愿望是:

  • 一种在文件中“快速转发”到文件中特定(而不是近似)点的方法。
  • 从这一点开始编写,并使输出与完整运行提供的输出完全相同(相同的大小、相同的长度、相同的确切字节)。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-20 12:40:08

通过执行以下操作,我成功地使它发挥了作用:

  • 在实际的关键帧定位之前,寻求位(1000 dts)。
  • 循环调用av_read_frame,直到我们到达关键帧为止。
  • 为每段 (avformat_write_headerav_write_trailer)写标题和预告片

最终的结果是,我可以从一个给定的时间戳开始,在这个时间戳中,我知道一个段即将开始,并创建了这些段(并且在我想要的任何段停止,但这是微不足道的)。结果片段与在完整运行过程中创建的部分相同。

票数 0
EN

Stack Overflow用户

发布于 2013-06-20 05:27:14

查找通常是不精确的,只会带您到文件索引中列出的点(通常是视频关键帧)。您可以尝试使用AVSEEK_FLAG_BACKWARD标志进行查找,在指定的点之前查找,然后从那里查找read+discard。

或者,您可能想看看FFMS2,它应该为libav函数提供一个更高级别的包装器,并具有帧精确搜索功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17192783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档