当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ffmpeg/avconv:使用相同的编解码器和参数作为输入进行转码》经验,为你挑选了1个好方法。

有没有一种方法可以告诉ffmpeg和/或avconv使用与输入编码相同的编解码器作为输出,但是可以进行转码吗?

我正在寻找类似的东西:

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

请注意,我并不是在寻找-vcodec copy,因为那样会无需进行转码就可以复制流。我希望它进行转码,但使用与输入文件编码相同的编解码器。

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

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



1> llogan..:

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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有