FFMPEG select between and 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

但是这里有必要列出这样的长列表,甚至不接受控制台窗口,开始寻找,找到-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

或者省略最后的过滤器输出标签以依赖于默认的流选择行为:

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
  • 用逗号(,)连接线性过滤器以创建过滤器链。
  • 用分号分隔过滤器链(;)。
  • 不要重复使用过滤器标签("pad ");
    • 错误:filtera[out0];[out0]filterb[out0]
    • 正确:filtera[out0];[out0]filterb[out1]

参见FFmpeg过滤文档:介绍。

相关内容

  • 没有找到相关文章

最新更新