2017-08-10 170 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