【发布时间】:2011-08-02 20:47:39
【问题描述】:
我打算使用 ffmpeg 来确保上传到我网站的所有视频文件都编码为 mp4 h264。
我不想自动处理每个文件,而是只处理那些还不是 mp4 h264 的文件,从而最大限度地减少处理开销。有没有一种简单的方法可以使用 ffmpeg 或其他命令行实用程序来做到这一点?
【问题讨论】:
标签: ffmpeg video-processing video-encoding
我打算使用 ffmpeg 来确保上传到我网站的所有视频文件都编码为 mp4 h264。
我不想自动处理每个文件,而是只处理那些还不是 mp4 h264 的文件,从而最大限度地减少处理开销。有没有一种简单的方法可以使用 ffmpeg 或其他命令行实用程序来做到这一点?
【问题讨论】:
标签: ffmpeg video-processing video-encoding
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]
仅当视频不是 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
这是一个简单的脚本,如果您输入的视频流不止一个,它将忽略其他视频流。
【讨论】:
如果您将输入文件传递给 ffmpeg,不带其他参数,它将为您提供有关视频源的信息:
ffmpeg -i myfile.avi
另一种方法是 mplayer 的 -identify 选项,它可能更容易解析。有一个包装脚本midentify 可以为您提供更好的输出。见this example.
【讨论】:
ffprobe,支持多种输出格式,如xml和json。简化 ffmpeg 输出的解析
另一种方法是使用 ffmpeg 中包含的ffprobe。以下将给出我可以从 ffmpeg 工具中找到的最简洁的输出:
ffprobe -hide_banner -stats -i myfile.avi
【讨论】: