ffmpeg / avconv:使用相同的编解码器和参数作为输入进行转码

时间:2015-12-23 19:07:10

标签: ffmpeg

有没有办法告诉ffmpeg和/或avconv为输出使用与输入编码的编解码器相同的编解码器,但是进行转码?

我正在寻找类似的东西:

ffmpeg -i input.mp4 -vcodec same_as_input output.mp4

请注意,我不是在寻找-vcodec copy,因为这会在没有转码的情况下复制流。我希望它进行转码,但使用相同的编解码器,输入文件用。编码。

另外,如果可能的话,我希望对每个可能的参数都有相同的内容,即:使用相同的比特率,帧大小等,从一个给定的输入文件中获取每个可能参数的值,而不是使用任何其他默认值。

以上示例可能看起来很愚蠢,因为它过于简单(结果与复制相同),但想象一下我添加了一些处理,例如开始时间和长度,甚至更复杂的事情,例如添加叠加图像,但我想确保使用与输入文件相同的编码器(可能是相同的参数)进行编码。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这似乎有效

file="input.mp4"
ffmpeg -re -y -i "$file"  -c:v `ffprobe $file |& grep 'Video:' | awk -v N=4 '{print $N}'`  -b:v `ffprobe $file |& grep 'Video:' | awk -v N=15 '{print $N}'`k -f flv output.mp4

这里的关键是这部分,它从输入文件中获取视频编解码器。您会注意到它在语句中出现两次,第二次它会获取比特率。

`ffprobe $file |& grep 'Video:' | awk -v N=4 '{print $N}'`