【问题标题】:FFmpeg: Read profile level information from mp4FFmpeg:从 mp4 读取配置文件级别信息
【发布时间】:2012-05-01 19:50:21
【问题描述】:

我有一个 mp4 文件,需要它的配置文件级别。 FFmpeg 说,它有基线配置文件,这是我需要的,但我还需要 level

这是我从 FFmpeg 得到的:

ffmpeg version 0.8, Copyright (c) 2000-2011 the FFmpeg developers
  built on Jul 20 2011 13:32:19 with gcc 4.4.3
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264
  libavutil    51.  9. 1 / 51.  9. 1
  libavcodec   53.  7. 0 / 53.  7. 0
  libavformat  53.  4. 0 / 53.  4. 0
  libavdevice  53.  1. 1 / 53.  1. 1
  libavfilter   2. 23. 0 /  2. 23. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  51.  2. 0 / 51.  2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test-show.mp4':
  Metadata:
    major_brand     : f4v 
    minor_version   : 0
    compatible_brands: isommp42m4v 
    creation_time   : 2012-03-21 16:00:00
  Duration: 00:56:07.40, start: 0.000000, bitrate: 2004 kb/s
    Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 854x480 [PAR 1:1 DAR 427:240], 1904 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Metadata:
      creation_time   : 2012-03-21 16:00:00
    Stream #0.1(eng): Audio: aac, 48000 Hz, stereo, s16, 96 kb/s
    Metadata:
      creation_time   : 2012-03-21 16:00:00
At least one output file must be specified

除了-i 之外,我还有什么选项可以用来获取关卡信息吗?

【问题讨论】:

    标签: ffmpeg h.264 mp4


    【解决方案1】:

    试试ffprobe -show_streams

    ffprobe 与 FFmpeg 捆绑在一起,并提供有关视频文件的大量信息,包括关卡信息,例如:

    $ ffprobe -loglevel error -show_streams Test.mp4 
    [STREAM]
    index=0
    codec_name=h264
    codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
    codec_type=video
    codec_time_base=1001/48000
    codec_tag_string=avc1
    codec_tag=0x31637661
    width=704
    height=400
    has_b_frames=0
    sample_aspect_ratio=N/A
    display_aspect_ratio=N/A
    pix_fmt=yuv420p
    level=51                 <== level!
    timecode=N/A
    is_avc=1
    nal_length_size=4
    id=N/A
    r_frame_rate=24000/1001
    avg_frame_rate=1384898760/57761819
    time_base=1/44100
    start_time=0.000000
    duration=6548.959070
    bit_rate=701946
    nb_frames=157018
    nb_read_frames=N/A
    nb_read_packets=N/A
    TAG:creation_time=2006-08-17 18:14:49
    TAG:language=eng
    TAG:handler_name=
    [/STREAM]
    

    【讨论】:

    • 是的,这给了我更多信息,但比您从文件中获得的信息要少,而不是级别信息:/
    • 嗯,如果 ffprobe 没有显示,那我想知道它是否真的存在。您是否能够使用任何其他(非 CLI)工具(如 VLC)获取文件的级别信息?
    • @Martin,想知道你所说的“比你从文件中得到的要少,而不是级别信息”是什么意思。视频流部分中的 level 不是你想要的吗?
    • 但它也将包括音频流,有些也有级别信息。此外,在多个文件上解析和减慢也很困难。也许您想以 Profile: High@L4.0 格式查看它。看看我的回答。
    • @blahdiblah 但是ffprobe 确实 显示Level 值 - 它有点隐藏在发布的输出中,但请查找level=51
    【解决方案2】:

    您可以使用带有选项 -info 的 MP4Box 来获得这种输出:

    Track # 2 Info - TrackID 2 - TimeScale 25000 - Duration 01:29:42.160
    Media Info: Language "Undetermined" - Type "vide:avc1" - 134554 samples
    MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21
    AVC/H264 Video - Visual Size 1280 x 720 - **Profile High @ Level 3.1**
    NAL Unit length bits: 32
    Pixel Aspect Ratio 1:1 - Indicated track size 1280 x 720
    Synchronized on stream 1
    

    【讨论】:

      【解决方案3】:

      尝试以下以获取更详细的 json 输出

      $ ffprobe -print_format json -show_streams -show_format <filepath>
      

      【讨论】:

      • -show_format 将除了 -show_streams 打印容器信息,那里没有 Profile 信息,但 json 输出可能对某些人来说很方便
      【解决方案4】:

      ffprobeshow_entries 命令应该更快,并且它有更多选项来仅显示相关数据并仅过滤视频流。

      仅过滤视频(还添加 :0 以仅过滤第一个视频流)

      ffprobe -v error -select_streams v:0 -show_entries stream=level -of default=noprint_wrappers=1 <filepath>
      

      例如输出:
      等级=50


      只输出值(添加:nokey=1):

      ffprobe -v error -select_streams v:0 -show_entries stream=level -of default=noprint_wrappers=1:nokey=1 <filepath>
      

      例如输出:
      50


      一次性输出 Profile 和 Level:

      ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of default=noprint_wrappers=1 <filepath>
      

      例如输出:
      profile=高
      等级=50


      以json格式输出:

      ffprobe -v error -select_streams v:0 -show_entries stream=profile,level -of json <filepath>
      

      例如输出:

      {
          "programs": [
      
          ],
          "streams": [
              {
                  "profile": "High",
                  "level": 41
              }
          ]
      }
      

      在 MS 批处理文件中(作为假函数):
      调用:ffprobeGetFormatProfile ffprobe.exe file.mp4 txtFormat

      :ffprobeGetFormatProfile <exe> <infile> <outStr>
      echo.
      echo FILE: %2
      
      set tmpProfile=
      set tmpLevel=
      for /f "usebackq delims== tokens=1-2" %%a in (`%~s1 -v error -select_streams v:0 -show_entries stream^=profile^,level -of default^=noprint_wrappers^=1 %2`) do (
          if /I %%a == profile set tmpProfile=%%b
          if /I %%a == level set tmpLevel=%%b
      )
      if not defined tmpLevel set tmpLevel=??
      echo on
      set %3=%tmpProfile%@%tmpLevel:~0,1%.%tmpLevel:~1%
      @echo off
      
      exit /b %errorlevel%
      

      例如输出(在变量 txtFormat 作为第三个参数传递):
      高@4.1


      您可以从ffmpeg.org - Tips获得更多想法

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 2021-03-28
        • 2014-01-13
        • 1970-01-01
        • 2014-03-08
        • 2013-05-29
        • 2013-12-22
        • 2013-06-28
        • 1970-01-01
        相关资源
        最近更新 更多