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]
我需要 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]
- 不正确: