有没有办法在转码之前使用 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:使用相同的编解码器和参数作为输入进行转码

FFMPEG入门篇

FFMPEG入门篇

asp.net 使用FFmpeg将视频转换为mp4格式

Lambda 上的 FFmpeg 转码导致无法使用(静态)音频

使用ffmpeg转码m3u8并播放