有没有办法在转码之前使用 ffmpeg 来确定文件的编码?
Posted
技术标签:
【中文标题】有没有办法在转码之前使用 ffmpeg 来确定文件的编码?【英文标题】:Is there a way to use ffmpeg to determine the encoding of a file before transcoding? 【发布时间】:2011-08-02 20:47:39 【问题描述】:我打算使用 ffmpeg 来确保上传到我网站的所有视频文件都编码为 mp4 h264。
我不想自动处理每个文件,而是只处理那些还不是 mp4 h264 的文件,从而最大限度地减少处理开销。有没有一种简单的方法可以使用 ffmpeg 或其他命令行实用程序来做到这一点?
【问题讨论】:
how to recognize video codec of a file with ffmpeg的可能重复 【参考方案1】:使用ffprobe
示例命令
$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 input.mp4
结果
h264
选项说明
-v error
省略除致命错误外的额外信息。
-select_streams v:0
只选择第一个视频流。否则,文件中所有其他流(例如音频)的 codec_name
也会显示。
-show_entries stream=codec_name
只输出codec_name
而不是所有的流信息。
-of default=nokey=1:noprint_wrappers=1
选择默认输出格式样式并省略密钥和包装信息。否则,如果没有这些选项,它将输出:
[STREAM]
codec_name=h264
[/STREAM]
另见
ffprobe
documentation
FFmpeg Wiki: FFprobe Tips
Bash 脚本示例
仅当视频不是 H.264 时才重新编码:
#!/bin/bash
mkdir h264vids
for f in *.mkv
do
audioformat=$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
if [ "$audioformat" = "h264" ]; then
ffmpeg -i "$f" -c:v copy -c:a aac -movflags +faststart h264vids/"$f%.*.mp4"
else
ffmpeg -i "$f" -c:v libx264 -c:a aac -movflags +faststart h264vids/"$f%.*.mp4"
fi
done
这是一个简单的脚本,如果您输入的视频流不止一个,它将忽略其他视频流。
【讨论】:
【参考方案2】:如果您将输入文件传递给 ffmpeg,不带其他参数,它将为您提供有关视频源的信息:
ffmpeg -i myfile.avi
另一种方法是 mplayer 的 -identify
选项,它可能更容易解析。有一个包装脚本midentify
可以为您提供更好的输出。见this example.
【讨论】:
太好了,它为我提供了我需要的信息。虽然不想解析输出:) MediaInfo 可以做到这一点,并具有可选的 XML 输出。 mediainfo.sourceforge.net/en - 获取命令行版本。 ffmpeg 包包含命令ffprobe
,支持多种输出格式,如xml和json。简化 ffmpeg 输出的解析【参考方案3】:
另一种方法是使用 ffmpeg 中包含的ffprobe
。以下将给出我可以从 ffmpeg 工具中找到的最简洁的输出:
ffprobe -hide_banner -stats -i myfile.avi
【讨论】:
以上是关于有没有办法在转码之前使用 ffmpeg 来确定文件的编码?的主要内容,如果未能解决你的问题,请参考以下文章
ffmpeg/avconv:使用相同的编解码器和参数作为输入进行转码