4 回答
![?](http://img1.sycdn.imooc.com/545868550001f60202200220-100-100.jpg)
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 个或更多流吗?
![?](http://img1.sycdn.imooc.com/545867790001599f02200220-100-100.jpg)
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
![?](http://img1.sycdn.imooc.com/533e4c5600017c5b02010200-100-100.jpg)
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])
![?](http://img1.sycdn.imooc.com/545861b80001d27c02200220-100-100.jpg)
TA贡献1860条经验 获得超9个赞
答案并不太难。
苹果
pip3 install ffprobe
视窗
pip install ffprobe
操作系统
pip install ffprobe
用法
ffprobe -show_streams -print_format json input.mov
应该管用。
添加回答
举报