我计划使用ffmpeg来确保上传到我网站的所有视频文件都被编码为mp4 h264。
而不是自动处理每个文件,我想通过只处理那些不是mp4 h264的文件来最小化处理开销。是否有一种简单的方法可以使用ffmpeg或其他命令行实用程序来做到这一点?
使用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
选择默认的输出格式样式,忽略key和wrapper信息。否则,如果没有这些选项,它将输出:[STREAM] codec_name=h264 [/STREAM]
也看到
-
ffprobe
文档 - 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
这是一个简单的脚本,如果输入的视频流不止一个,它将忽略其他视频流。
如果你传递一个输入文件给ffmpeg,没有其他参数,它会给你关于视频源的信息:
ffmpeg -i myfile.avi
另一种方法是mplayer的-identify
选项,这可能更容易解析。有一个包装器脚本midentify
,它可以提供更好的输出。
另一种选择是使用ffmpeg中包含的ffprobe
。下面将给出我能从ffmpeg工具中找到的最简洁的输出:
ffprobe -hide_banner -stats -i myfile.avi
正如上文所说,让我为其他新手简化一下,video265.mp4是你的视频文件:
ffprobe -v error -show_entries stream=codec_name video265.mp4
结果:[STREAM]
codec_name=hevc
[/STREAM]