【问题标题】:Is there a way to use ffmpeg to determine the encoding of a file before transcoding?有没有办法在转码之前使用 ffmpeg 来确定文件的编码?
【发布时间】:2011-08-02 20:47:39
【问题描述】:

我打算使用 ffmpeg 来确保上传到我网站的所有视频文件都编码为 mp4 h264。

我不想自动处理每个文件,而是只处理那些还不是 mp4 h264 的文件,从而最大限度地减少处理开销。有没有一种简单的方法可以使用 ffmpeg 或其他命令行实用程序来做到这一点?

【问题讨论】:

标签: ffmpeg video-processing video-encoding


【解决方案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]
    

另见

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
    

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2011-08-29
      • 2019-10-25
      • 2011-11-19
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2020-07-12
      相关资源
      最近更新 更多