0

我正在编写一个依赖 FFMPEG 将音频解码为 WAV 格式的 Python 程序。我希望能够处理尽可能多类型的音频,但我需要一种方法来快速检查我是否可以实际使用上传的文件。我在这里编译了我自己的 FFMPEG 安装。

具体来说,我想在我的应用程序中强制执行这样的逻辑:

if ffmpeg_type(file_path) is not "audio":
    raise Exception("Bro, that's not an audio file.")
elif not ffmpeg_can_decode_audio(file_path):
    raise Exception("I have no way of working with this.")

(我意识到这并不像调用这些方法那么简单,我假设我需要解析系统调用的输出。)

有没有办法可以使用命令行ffmpeg,ffprobe等来确定给定文件是否是音频文件以及是否可以对其进行解码?

4

2 回答 2

0

要知道它是否是音频文件,请检查音频编解码器解析 ffmpeg 输出中的 'Stream #0:' 字段

如果没有带有音频字段的 Stream #0:0: 或 Stream #0:1:,则您的文件不是音频。Stream #0:1 通常意味着它是一个视频文件(视频+音频)。

稍后,使用此编解码器名称,检查它是否适合您的系统。

mp3 文件的示例:

ffmpeg -i yourfile 

.......

Duration: 00:05:01.74, start: 0.000000, bitrate: 203 kb/s
Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
于 2013-10-29T08:23:06.493 回答
0

您可以使用 FFProbe 来识别文件类型,但您很可能需要维护一个您知道如何在应用程序中处理的文件格式的数据库。但是,这里有一个快速的片段:

import json, subprocess
file_name = u'/path/to/some/file.mp3'
command=["/path/to/ffmpeg/bin/ffprobe",
         '-print_format', 'json',
         '-v', 'quiet',
         '-show_error',
         '-show_format',
         #'-show_frames',
         #'-show_packets',
         '-show_streams',
         '-show_program_version',
         '-show_library_versions',
         '-show_versions',
         '-show_private_data',
         file_name]
process_data=subprocess.Popen(command, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
returncode = process_data.wait()
json_result=json.loads(process_data.stdout.read())
print json_result.get(u'format')

这个函数将返回一个看起来像这样的字典:

"format": {
    "filename": "/path/to/some/file.mp3",
    "nb_streams": 1,
    "format_name": "mp3",
    "format_long_name": "MP2/3 (MPEG audio layer 2/3)",
    "start_time": "0.000000",
    "duration": "12.416125",
    "size": "198658",
    "bit_rate": "128000",
    "tags": {
        "title": "Test of MP3 File              ",
        "artist": "Me                            ",
        "album": "Me                            ",
        "date": "2006",
        "comment": "test                        ",
        "track": "1",
        "genre": "Other"
    }

从这本字典中,您可以提取文件的“格式”,只知道该文件的路径!希望这可以帮助。

于 2013-10-29T02:50:44.590 回答