【问题标题】:How to detect audio sampling rate with avprobe / ffprobe?如何使用 avprobe / ffprobe 检测音频采样率?
【发布时间】:2013-08-10 07:48:36
【问题描述】:

我使用的是 libav 9.6,通过 Homebrew 安装。

$ avprobe -version
avprobe version 9.6, Copyright (c) 2007-2013 the Libav developers
  built on Jun  8 2013 02:44:19 with Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
avprobe 9.6
libavutil     52.  3. 0 / 52.  3. 0
libavcodec    54. 35. 0 / 54. 35. 0
libavformat   54. 20. 3 / 54. 20. 3
libavdevice   53.  2. 0 / 53.  2. 0
libavfilter    3.  3. 0 /  3.  3. 0
libavresample  1.  0. 1 /  1.  0. 1
libswscale     2.  1. 1 /  2.  1. 1

即使采样率显示在命令行输出的标准输出中,-show_format 选项根本不会显示音频文件的采样率信息。

这是 BASH 终端输出:

$ avprobe  -v verbose -show_format -of json  sample.gsm
avprobe version 9.6, Copyright (c) 2007-2013 the Libav developers
  built on Jun  8 2013 02:44:19 with Apple LLVM version 4.2 (clang-425.0.24)
(based on LLVM 3.2svn)
  configuration: --prefix=/usr/local/Cellar/libav/9.6 --enable-shared
--enable-pthreads --enable-gpl --enable-version3 --enable-nonfree
--enable-hardcoded-tables --enable-avresample --enable-vda --enable-gnutls
--enable-runtime-cpudetect --disable-indev=jack --cc=cc --host-cflags=
--host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame
--enable-libxvid --enable-avplay
  libavutil     52.  3. 0 / 52.  3. 0
  libavcodec    54. 35. 0 / 54. 35. 0
  libavformat   54. 20. 3 / 54. 20. 3
  libavdevice   53.  2. 0 / 53.  2. 0
  libavfilter    3.  3. 0 /  3.  3. 0
  libavresample  1.  0. 1 /  1.  0. 1
  libswscale     2.  1. 1 /  2.  1. 1
[gsm @ 0x7f8012806600] Estimating duration from bitrate, this may be inaccurate
Input #0, gsm, from 'sample.gsm':
  Duration: 00:03:52.32, start: 0.000000, bitrate: 13 kb/s
    Stream #0.0: Audio: gsm, 8000 Hz, mono, s16, 13 kb/s
{  "format" : {
    "filename" : "sample.gsm",
    "nb_streams" : 1,
    "format_name" : "gsm",
    "format_long_name" : "raw GSM",
    "start_time" : "0.000000",
    "duration" : "232.320000",
    "size" : "383328.000000",
    "bit_rate" : "13200.000000"
  }}

还有python代码示例:

>>> filename = 'sample.gsm'
>>> result = subprocess.check_output(['avprobe', '-show_format', '-of',
'json', filename])
avprobe version 9.6, Copyright (c) 2007-2013 the Libav developers
  built on Jun  8 2013 02:44:19 with Apple LLVM version 4.2
(clang-425.0.24) (based on LLVM 3.2svn)
[gsm @ 0x7fe0b1806600] Estimating duration from bitrate, this may be
inaccurate
Input #0, gsm, from 'sample.gsm':
  Duration: 00:03:52.32, start: 0.000000, bitrate: 13 kb/s
    Stream #0.0: Audio: gsm, 8000 Hz, mono, s16, 13 kb/s
>>> print result
{  "format" : {
    "filename" : "sample.gsm",
    "nb_streams" : 1,
    "format_name" : "gsm",
    "format_long_name" : "raw GSM",
    "start_time" : "0.000000",
    "duration" : "232.320000",
    "size" : "383328.000000",
    "bit_rate" : "13200.000000"
}}

所以我知道采样率可能是特定于流的显示,将显示在-show_format 选项结果中。但是没有任何其他选项可以检测特定音频流的采样率,即使在重新编码时可以使用-ar 设置它。

我向 libav 提交了a ticket,但我只是好奇是否有任何其他方法可以从 libav 探测工具中提取采样率。事先感谢您的回答。

PS:这种情况下ffmpeg(ffprobe)的上游项目也是同样的问题。

【问题讨论】:

    标签: ffmpeg libav ffprobe avprobe


    【解决方案1】:

    Enis Berk's answer 之后,我们可以在shell 中使用jq(解析json)做同样的事情。

    ffprobe -hide_banner -loglevel panic -show_format -show_streams -of json input.wav | \
      jq '.streams[0].sample_rate'
    

    “44100”

    【讨论】:

      【解决方案2】:

      我发现 json 库可以将 ffprobe 的输出解析为字典,并详细说明了您的代码以将信息存储在 python 中。 如果您愿意,这是一个执行此操作并打印媒体信息的函数:

      import json
      from subprocess import check_output
      
      def get_media_info(filename, print_result=True):
          """
          Returns:
              result = dict with audio info where:
              result['format'] contains dict of tags, bit rate etc.
              result['streams'] contains a dict per stream with sample rate, channels etc.
          """
          result = check_output(['ffprobe',
                                  '-hide_banner', '-loglevel', 'panic',
                                  '-show_format',
                                  '-show_streams',
                                  '-of',
                                  'json', filename])
      
          result = json.loads(result)
      
          if print_result:
              print('\nFormat')
      
              for key, value in result['format'].items():
                  print('   ', key, ':', value)
      
              print('\nStreams')
              for stream in result['streams']:
                  for key, value in stream.items():
                      print('   ', key, ':', value)
      
              print('\n')
      
          return result
      

      【讨论】:

        【解决方案3】:

        -show_format 显示容器级信息——即适用于所有流的内容。采样率是单个流的属性,所以-show_format 不显示它是完全正常的。您需要使用-show_streams

        【讨论】:

        • 完美!感谢您的解释安东! -show_streams 工作 :)
        • 为了进一步缩小音频流的输出范围,我们可以添加-select_stream a,结果类似于:ffprobe -select_streams a -show_streams input.flac
        猜你喜欢
        • 2017-09-15
        • 1970-01-01
        • 2016-04-21
        • 2017-03-04
        • 2011-05-28
        • 1970-01-01
        • 2011-01-06
        • 2019-02-06
        • 1970-01-01
        相关资源
        最近更新 更多