4 回答

TA貢獻1802條經驗 獲得超5個贊
我相信我找到了通過傳入以下選項對輸出為1
(對于True
,有聲音)或0
(對于False
,沒有聲音)的任何視頻文件進行排序的nb_streams
選項format
。
def has_audio(filename):
? ? result = subprocess.run(["ffprobe", "-v", "error", "-show_entries",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"format=nb_streams", "-of",
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"default=noprint_wrappers=1:nokey=1", filename],
? ? ? ? stdout=subprocess.PIPE,
? ? ? ? stderr=subprocess.STDOUT)
? ? return (int(result.stdout) -1)
該代碼實際上返回流的數量。2對于兩個流,視頻和音頻,或1僅視頻。我減去一是因為我想要布爾答案。
這可能不應該用于對純音頻文件進行排序。盡管我想知道1對于視頻以及2音頻和視頻來說,對于已知的視頻文件是否總是如此。一個視頻文件可以有 3 個或更多流嗎?

TA貢獻1793條經驗 獲得超6個贊
基于之前的答案,這將檢查每個流以查看是否至少有一個具有“音頻”類型編解碼器。請注意,音頻流可能存在但無聲,在這種情況下,該值仍將返回 True。
from subprocess import check_output
import json
def has_audio_streams(file_path):
command = ['ffprobe', '-show_streams',
'-print_format', 'json', file_path]
output = check_output(command)
parsed = json.loads(output)
streams = parsed['streams']
audio_streams = list(filter((lambda x: x['codec_type'] == 'audio'), streams))
return len(audio_streams) > 0

TA貢獻1719條經驗 獲得超6個贊
可以使用pymediainfo模塊來實現這一點。
def has_audio(p):
from pymediainfo import MediaInfo
fileInfo = MediaInfo.parse(p)
return any([track.track_type == 'Audio' for track in fileInfo.tracks])

TA貢獻1860條經驗 獲得超9個贊
答案并不太難。
蘋果
pip3 install ffprobe
視窗
pip install ffprobe
操作系統
pip install ffprobe
用法
ffprobe -show_streams -print_format json input.mov
應該管用。
添加回答
舉報