我正在编写一个Python程序,它依赖于FFMPEG将音频解码为WAV格式。我希望能够处理多种类型的音频,但我需要一种方法来快速检查我是否可以实际使用上传的文件。我在这里编译了自己的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
等来确定给定文件是否是音频文件以及我是否可以对其进行解码?
答案 0 :(得分: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"
}
从这本词典中,您可以提取文件的“格式”,只知道该文件的路径!希望这会有所帮助。
答案 1 :(得分:0)
要知道它是否是音频文件,请检查解析ffmpeg输出中“Stream#0:”字段的音频编解码器
如果没有Stream#0:0:或Stream#0:1:使用Audio字段,则您的文件不是音频。流#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