ffmpeg/avconv : transcode using same codec and params as input

标签 ffmpeg

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

我正在寻找类似的东西:

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

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

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

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

最佳答案

ffmpeg没有复制相同比特率的功能,但它会自动复制帧速率、宽度、高度、像素格式、纵横比、音频 channel 数、音频采样率等(取决于编码器)。

由于各种原因,我不建议复制相同的比特率,最终会变成几个段落。简而言之,让编码器自动处理。

但是,这是一个简单的 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 .

关于ffmpeg/avconv : transcode using same codec and params as input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34442156/

相关文章:

ffmpeg - 将过滤器与普通选项相结合

shell - ffmpeg:如何为所有视频输出添加水印?

ffmpeg - 有关 ffmpeg 的信息,如果有的话,它使用什么算法

几秒钟后,ffmpeg 直播停止到 facebook

Python使用存储在变量中的将stdout和stderr发送到多个文件

c# - 是否可以使用 Emgu CV 3.0 通过 rstp 协议(protocol)和 ffmpeg h264 打开实时流

FFMPEG - filter_complex lut 文件路径在 Windows 上出现问题

xcode - 从 QtApp 链接到 FFmpeg 时出现 libavcodec.a 链接器错误

ffmpeg - 将 image.png 添加到 image.jpg 的顶部,ffmpeg 变得更暗

FFmpeg/FFplay directshow 和 blackmagic