亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Python中檢查視頻是否有聲音?

如何在Python中檢查視頻是否有聲音?

明月笑刀無情 2023-10-18 15:30:51
我只想知道True視頻是否有音頻或False沒有音頻。我覺得使用子流程就快到了。我獲取有關正在運行的視頻文件的信息ffprobe并將結果拆分為列表。我嘗試匹配列表中包含或不包含音頻的字符串,但這并沒有給出一致的結果。from subprocess import Popen, PIPEimport subprocessb = '/path/to/mp4''0:1' in str(subprocess.run(['ffprobe', b], stdout=PIPE, stderr=PIPE).stderr.split()[-20])  上面的行檢查視頻文件中從最后一行算起的第 20 行是否有第二個流。就像我說的,并不總是一致的。我只是在請求或解析我從中得到的內容時遇到困難ffmprobe。這是ffprobe從最后一項返回的所有內容,而不僅僅是第 20 項。b = '/path/to/mp4'subprocess.run(['ffprobe', b], stdout=PIPE, stderr=PIPE).stderr.split()  返回...我還嘗試將此函數從返回視頻文件的持續時間的函數修改為返回True或False返回音頻的函數,因為這可能是一種不太簡單的獲取布爾值的方法。我有點無法嘗試使用這些不同的選項。def get_length(filename):    result = subprocess.run(["ffprobe", "-v", "error", "-show_entries",                             "format=duration", "-of",                             "default=noprint_wrappers=1:nokey=1", filename],        stdout=subprocess.PIPE,        stderr=subprocess.STDOUT)    return float(result.stdout)
查看完整描述

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 個或更多流嗎?


查看完整回答
反對 回復 2023-10-18
?
搖曳的薔薇

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


查看完整回答
反對 回復 2023-10-18
?
慕俠2389804

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])


查看完整回答
反對 回復 2023-10-18
?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

答案并不太難。

蘋果

pip3 install ffprobe

視窗

pip install ffprobe

操作系統

pip install ffprobe

用法

ffprobe -show_streams -print_format json input.mov應該管用。


查看完整回答
反對 回復 2023-10-18
  • 4 回答
  • 0 關注
  • 390 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號