不是使用-ss和-to寻找看起来不太准确的参数,我可以根据给定的帧数剪切视频吗?例如;
ffmpeg -i video.webm -startingframe 80 -endingframe 560 output.webm
Run Code Online (Sandbox Code Playgroud)
[包括第 80 帧和第 560 帧。因此,总的来说它使 (560 - 80 +1) 帧]
在回答和搜索之后,我尝试了一些命令。但到目前为止,我找不到可接受的方式。
如果有人想在第 250 帧和第 750 帧之间剪切视频流,这就是要走的路。它将给出 501 帧作为输出:
注意: movie.mp4 为 25 fps,音频采样率为 48k
ffmpeg -i movie.mp4 -an -vf "select=between(n\,250\,750),setpts=PTS-STARTPTS" v_stream.webm
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,输出正好是 20 秒。
对音频使用相同的方法:
ffmpeg -i movie.mp4 -vn -af "aselect=between(n\,480\,1440),setpts=PTS-STARTPTS" a_stream.webm
Run Code Online (Sandbox Code Playgroud)
出乎意料的是,这个精度很差。它应该给了我 960001 (960k+1) 个等于 20 秒音频的样本。但是,输出的长度为 20.505 秒,并且有 984240 个样本。此外,如果我增加持续时间,错误也会增加。
然后我尝试使用 -ss -to 参数来切割音频流:
ffmpeg -i movie.mp4 -vn -ss 10.000 -to 30.000 a_stream.webm
Run Code Online (Sandbox Code Playgroud)
旧的经典方式效果更好。输出长度为 20.003 …
我的理解是 -X 选项应该在作业之间均匀分配参数。然而,我得到了一个非常倾斜的分布:
user@host:/tmp/ptest$ count() {
> echo $#
> }
user@host:/tmp/ptest$ export -f count
user@host:/tmp/ptest$ count *.jpg
5825
user@host:/tmp/ptest$ parallel -X count ::: *.jpg
5039
197
197
197
195
Run Code Online (Sandbox Code Playgroud)
有趣的是,仅使用文件的子集会导致参数均匀分布:
user@host:/tmp/ptest$ count p129*.jpg
975
user@host:/tmp/ptest$ parallel -X count ::: p129*.jpg
244
244
244
243
user@host:/tmp/ptest$ count p12*.jpg
4007
user@host:/tmp/ptest$ parallel -X count ::: p12*.jpg
1002
1002
1002
1001
user@host:/tmp/ptest$ count p13*.jpg
1818
user@host:/tmp/ptest$ parallel -X count ::: p13*.jpg
455
455
455
453
Run Code Online (Sandbox Code Playgroud)
为什么第一种情况是错误的,我该如何修复它?