ffmpeg分割视频的方法

时间:2024-02-25 15:49:49

ffmpeg可以说是一个比较全能的编解码器,但我在分割视频的时候视频被他重新编码了,明明是copy却变成了encode。

我使用的命令是这样的:

1
ffmpeg -vcodec copy -acodec copy -ss 01:00:00 -t 00:00:30 -i input_file_h264.mp4 output_file.mp4

本来只是想分割出一段视频的,但却把分离出来的视频重新编码了,画质也变得惨不忍睹。

查了一些国外资料后发现了问题所在。

在ffmpeg的手册中对于codec是这样写的:

‘-c[:stream_specifier] codec (input/output,per-stream)’
‘-codec[:stream_specifier] codec (input/output,per-stream)’
Select an encoder (when used before an output file) or a decoder (when used before an input file) for one or more streams. codec is the name of a decoder/encoder or a special value copy (output only) to indicate that the stream is not to be re-encoded.

意思就是如果把-codec放到输出文件的前面就当做编码器(encoder),在输入文件前面就当做解码器(decoder)。再看看我用的命令,-codec是在最前面的,也就是在输入文件的前面,copy被当做了解码器,这也是很多人遇到 Unknown decoder ‘copy’ 的原因。copy是一种特殊的编码器,因此-codec必须放在输出文件的前面。

还有就是关于-s选项的解释:

‘-ss position (input/output)’
When used as an input option (before -i), seeks in this input file to position. When used as an output option (before an output filename), decodes but discards input until the timestamps reach position. This is slower, but more accurate.

position may be either in seconds or in hh:mm:ss[.xxx] form.

意思就是如果要把-ss作为输入选项的话要放在-i之前,当做输出选项的话放在输出文件之前。我们这是要截取一段视频,应该当做输入选项,所以-ss要在-i之前才有效,不然会花费很长一段时间来寻找-ss。

最后分割视频的命令就变成了:

1
ffmpeg -ss 01:00:00 -i input_file_h264.mp4 -vcodec copy -acodec copy -t 00:06:00 output_file.mp4

果然,用最新版的ffmpeg也能成功分割。从上面我们可以发现一些选项的顺序是非常重要的,错误的顺序有时会造成截然不同的结果,不止ffmpeg,x264、mencoder等这些编码器也是如此。