如何以编程方式使用 FFMpeg 修剪文件?(libavformat, avutils, ...)

use*_*526 5 ffmpeg video-processing libav ios libavformat

我正在构建一个 iOS 应用程序,其中需要在后台重新编码和修剪视频。

我不能使用 iOS 库 (AVFoundation),因为它们依赖于 GPU,如果它是后台的,则没有应用程序可以访问 GPU。

由于这个问题,我切换到 FFMpeg 并编译它(与 libx264 一起)并将它集成到我的 iOS 应用程序中。

总结一下我需要的是:

  1. 修剪前 10 秒的视频
  2. 重新缩放视频

几周后——我经常用头撞墙——我设法:

  • 将视频容器拆分为流(解复用)
  • 将音频流复制到输出流中(无解码或编码)
  • 解码视频流,每帧运行必要的过滤器,编码每个结果帧并将其重新混合到输出流(我解码 h264,过滤它,将其重新编码回 h264)

如果我要通过命令行运行 ffmpeg,我会像这样运行它:

ffmpeg -i input.MOV -ss 0 -t 10  -vf scale=320:240 -c:v libx264 -preset ultrafast -c:a copy output.mkv
Run Code Online (Sandbox Code Playgroud)

我关心的是如何修剪视频?虽然我可以计算我编码/解码的视频帧的数量,并根据 FPS 决定何时停止,但我不能对音频做同样的事情,因为我只是对其进行解复用和重新复用。

理想情况下 - 在缩放视频之前 - 我会运行一个过程,通过将每个流(视频和音频)的 10 秒复制到一个新的视频容器中来修剪视频。

如何通过 AV 库实现这一目标?

小智 -1

我知道你可以通过调用 ffmpeg 来完成此操作:

ffmpeg -i input.MOV -filter_complex [0:v]trim=duration=10.0,scale=320:240[vid];[0:a]atrim=duration=10.0[aud] -map [vid] -map [aud] -c:v libx264 -preset ultrafast -c:a libvo_aacenc -b:a 128k -flags +aic+mv4 output.mkv
Run Code Online (Sandbox Code Playgroud)