视频处理——在转码之前,有没有一种方法可以使用ffmpeg来确定文件的编码?



我计划使用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]

相关内容

  • 没有找到相关文章

最新更新