如何在Python中检查视频是否有声音?

我只想知道True视频是否有音频或False没有音频。


我觉得使用子流程就快到了。


我获取有关正在运行的视频文件的信息ffprobe并将结果拆分为列表。

我尝试匹配列表中包含或不包含音频的字符串,但这并没有给出一致的结果。


from subprocess import Popen, PIPE

import subprocess


b = '/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)


明月笑刀无情
浏览 166回答 4
4回答

慕后森

我相信我找到了通过传入以下选项对输出为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 个或更多流吗?

摇曳的蔷薇

基于之前的答案,这将检查每个流以查看是否至少有一个具有“音频”类型编解码器。请注意,音频流可能存在但无声,在这种情况下,该值仍将返回 True。from subprocess import check_outputimport jsondef 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

慕侠2389804

可以使用pymediainfo模块来实现这一点。def has_audio(p):    from pymediainfo import MediaInfo    fileInfo = MediaInfo.parse(p)    return any([track.track_type == 'Audio' for track in fileInfo.tracks])

慕码人2483693

答案并不太难。苹果pip3 install ffprobe视窗pip install ffprobe操作系统pip install ffprobe用法ffprobe -show_streams -print_format json input.mov应该管用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python