2017-08-10 166 views
-2

我正在寻找一种方法如何从视频文件中使用python提取视频帧和相应的音频片段。 我对opencv非常了解。但它只允许提取视频帧。没有提供音频。 我需要两个 - 视频帧和音频片段完全相互对应。如何在Linux上使用音频流读取python中的视频文件?

将是任何提示:)

+0

任务的主要目标是: 1)找到分析视频的时间片段(一个人出现/消失在一帧中); 2)分析找到的感兴趣的片段内的音频(该人说什么)。 我已经实现了人物检测和语音识别。所以,问题只是关于如何从视频文件中提取视频+音频。 –

回答

0

你是正确的,你无法通过的OpenCV来获取音频非常感谢。最好的办法可能是单独提取视频帧和音频,然后从那里操作。一些工具,可以帮助包括:

ffmpy

ffmpeg (via sub-process)

您可以了解更多关于子处理的ffmpeg对本次关联堆栈溢出答案在这里:https://stackoverflow.com/a/26741357/7604321

从此就可以在加载音频文件和处理以及您的视频帧。

没有更多的信息从你的问题我不能建议更多。

+0

我可以但真的不想直接使用ffmpeg或其命令行包装器(ffmpy)。这个解决方案看起来很复杂,而python通常提供解决任何任务的简单方法。这就是我寻找的原因。 –

+0

作为一个变种,我可以使用opencv来提取帧和额外的模块来分别提取音频。然后使用时间戳处理它们。 但是,一开始,我正在寻找一种即时可用的解决方案(如果存在)。 –

+0

也许PyMedia?我从来没有用过它。 – JCooke

0

最后,我找到了影片https://pypi.python.org/pypi/moviepy,它实现了ffmpeg的轻包装,并提供了在同一时间位置快速获取视频和音频帧的界面。你会发现下面的例子:除了提取A/V帧moviepy提供了音频/视频剪辑修改范围的功能谱

from moviepy.editor import * 

video = VideoFileClip('your video filename') 
audio = video.audio 
duration = video.duration # == audio.duration, presented in seconds, float 
#note video.fps != audio.fps 
step = 0.1 
for t in range(int(duration/step)): # runs through audio/video frames obtaining them by timestamp with step 100 msec 
    t = t * step 
    if t > audio.duration or t > video.duration: break 
    audio_frame = audio.get_frame(t) #numpy array representing mono/stereo values 
    video_frame = video.get_frame(t) #numpy array representing RGB/gray frame