有没有一种方法可以告诉ffmpeg和/或avconv使用与输入编码相同的编解码器作为输出,但是可以进行转码吗?
我正在寻找类似的东西:
ffmpeg -i input.mp4 -vcodec same_as_input output.mp4
请注意,我并不是在寻找-vcodec copy
,因为那样会无需进行转码就可以复制流。我希望它进行转码,但使用与输入文件编码相同的编解码器。
另外,如果可能,我希望每个可能的参数都具有相同的值,即:使用相同的比特率,帧大小等,从一个给定的输入文件中获取每个可能的参数的值,而不是使用任何其他默认值。
上面的示例可能看起来很愚蠢,因为它过于简化了(结果与复制相同),但是想象一下我添加了一些处理,例如开始时间和长度,甚至更复杂的处理(例如添加覆盖图像),但是我想确保使用与输入文件相同的编码器(可能还有相同的参数)进行编码。
ffmpeg
没有复制相同比特率的功能,但是它将自动复制帧率,宽度,高度,像素格式,长宽比,音频通道数,音频采样率等(取决于编码器)。
我不建议出于多种原因而复制相同的比特率,而最终会出现在几段中。简而言之,让编码器自动处理。
但是,这是一个简单的bash脚本。您需要对其进行调整,以包括音频流信息以及所需的任何其他参数。
#!/bin/bash # Copies the same video codec and bitrate: usually this is not a good idea. # Usage: ./vidsame input output echo "Calculating video bitrate. This can take a while for long videos." # Alternatively you could just use ffprobe to get video stream bitrate, # but not all inputs will show stream bitrate info, so ffmpeg is used instead. size="$(ffmpeg -i "$1" -f null -c copy -map 0:v:0 - |& awk -F'[:|kB]' '/video:/ {print $2}')" codec="$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nk=1:nw=1 "$1")" duration="$(ffprobe -loglevel error -select_streams v:0 -show_entries format=duration -of default=nk=1:nw=1 "$1")" bitrate="$(bc -l <<< "$size"/"$duration"*8.192)" ffmpeg -i "$1" -c:v "$codec" -b:v "$bitrate"k "$2" echo echo "Duration: $duration seconds" echo "Video stream size: $size KiB" echo "Video bitrate: $bitrate kb/s" echo "Video codec: $codec"
如果要使用其他参数ffprobe
来查看可用列表:
ffprobe -loglevel error -show_streams input.mkv
然后使用-select_entries
如脚本所示。
请注意,codec_name
并非总是与编码器名称匹配,但通常它会正常工作。请参阅ffmpeg -encoders
。