FFMPEG select 和 setpts 创建流的副本

FFMPEG select between and setpts creates copies of streams

我需要 trim 视频中的一些片段,这是我找到的最佳方法(不解包帧,或者 trim 仅关键帧,尽管无需转码即可这样做) 我不太明白这样的setpts的含义,ffmpeg写道','有问题,但它仍然有效。

ffmpeg -y -i 0310.mp4 -vf "select='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)',setpts=N/FRAME_RATE/TB" -af "aselect='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)',asetpts=N/SR/TB" -vcodec libx264 -b:v 978k -acodec aac -b:a 242k 0310_TT.mp4

但是这里需要列出一长串这样的中间件,甚至不接受控制台windows,开始寻找,发现-filter_complex_script,但据我了解它不是完全替代 -vf -af。但通过实验它似乎适应了。

ffmpeg -y -i 0310.mp4 -filter_complex_script mysavedscript.txt -vcodec libx264 -b:v 978k -acodec aac -b:a 242k 0310_TT.mp4

mysavedccript.txt:

[0:v:0]select='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)';
[0:v:0]setpts=N/FRAME_RATE/TB;
[0:a:0]aselect='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)';
[0:a:0]asetpts=N/SR/TB

因此,它会创建原始视频和音频轨道的副本。我尝试了一些映射,但还没有任何效果。来自 filter_complex 的过滤器会创建一些其他流。

Stream mapping:
  Stream #0:0 (h264) -> select
  Stream #0:0 (h264) -> setpts
  Stream #0:1 (aac) -> aselect
  Stream #0:1 (aac) -> asetpts
  select -> Stream #0:0 (libx264)
  setpts -> Stream #0:1 (libx264)
  aselect -> Stream #0:2 (aac)
  asetpts -> Stream #0:3 (aac)

结果我得到了这个,以及视频的中断持续时间:

Video: MPEG4 Video (H264) 1920x1080 60fps 1226kbps [V: h264 high L4.2, yuv420p, 1920x1080, 1226 kb/s]
Video: MPEG4 Video (H264) 1920x1080 60fps 975kbps [V: h264 high L4.2, yuv420p, 1920x1080, 975 kb/s]
Audio: AAC 48000Hz stereo 150kbps [A: SoundHandler (aac, 48000 Hz, stereo, 150 kb/s)]
Audio: AAC 48000Hz stereo 243kbps [A: SoundHandler (aac lc, 48000 Hz, stereo, 243 kb/s)]

有什么办法吗?或者也许有一些更好的方法来做这样的事情,有一个范围列表(时间格式或帧格式 start:end)

所有未标记的过滤图输出流都将添加到第一个输出文件中。您有 4 个未标记的过滤图输出流。

您可以使用:

ffmpeg -i input -filter_complex "[0:v:0]select='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)',setpts=N/FRAME_RATE/TB[outv]; [0:a:0]aselect='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)',asetpts=N/SR/TB[outa]" -map "[outv]" -map "[outa]" output.mp4

或省略最终过滤器输出标签以依赖默认 stream selection 行为:

ffmpeg -i input -filter_complex "[0:v:0]select='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)',setpts=N/FRAME_RATE/TB; [0:a:0]aselect='between(t,10.5,12.0)+between(t,12.5,15.0)+between(t,17.5,20.5)+between(t,23.0,25.0)',asetpts=N/SR/TB" output.mp4
  • 使用逗号 (,) 链接线性过滤器以创建过滤器链。
  • 用分号 (;) 分隔过滤器链。
  • 不要重复使用过滤器标签(“垫”):
    • 不正确:filtera[out0];[out0]filterb[out0]
    • 正确:filtera[out0];[out0]filterb[out1]

FFmpeg Filtering Documentation: Introduction