为了账号安全,请及时绑定邮箱和手机立即绑定

如何在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 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信