2013-10-29 100 views
0

我正在寫一個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

您可以使用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" 
    } 

從這個字典,你可以提取該文件的「格式」,只知道該文件的路徑!希望這可以幫助。

+0

很多時候,我甚至不知道它已經收到後的文件的類型,我沒有爲它的擴展。 –

+0

我可以假設,如果FFMPEG不知道它是什麼類型的文件,那麼當試圖分析文件時'ffprobe'會失敗? –

+0

如果它不知道它是什麼類型的文件,那麼是的。但是,ffprobe甚至可以將.txt文件識別爲'u'format_long_name':u'Tele-typewriter'。如果它不能識別文件,'print json_result.get(u'format')'的結果將是'None',並且在json_result中將存在一個名爲'error'的新鍵。 – VooDooNOFX

0

要知道,如果它是音頻文件,檢查音頻編解碼器解析「流#0:」字段中的ffmpeg輸出

如果沒有流#0:0:或流#0:1:與音頻字段,您的文件不是音頻。流#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 
相關問題