2017-10-28 149 views
0

我想從視頻中讀取幀,但在提取幀後視頻無用。所以我決定使用TempFile模塊。但是我使用cv2.VideoCapture(NamedTempFile.name)得到的幀始終是黑色的。我想知道這是否是正確的做法。如果沒有,有沒有更好的辦法? 我在下面附上了我的代碼的視頻捕獲部分。
另外我懷疑get_temp_video函數可能是錯誤的。如何使用OpenCV從python中的NamedTempFile中讀取視頻


def get_temp_video(url, temp_file): 
    r = requests.get(url, stream=True) 
    for chunk in r.iter_content(chunk_size=1024): 
     if chunk: 
      temp_file.write(chunk) 
    return temp_file 


def get_frame(video_url): 
    named_temp_file = NamedTemporaryFile() 
    named_temp_file = get_temp_video(video_url, named_temp_file) 
    named_temp_file.seek(0) 
    video = cv2.VideoCapture(named_temp_file.name) 
    while video.isOpened(): 
     ret, frame = video.read() 
     if ret: 
      temp_file = TemporaryFile() 
      np.save(temp_file, frame) 
      temp_file.seek(0) 
      upload_to_some_where(temp_file.read()) 
      temp_file.close() 
     else: 
      break 
    video.release() 
    named_temp_file.close() 

回答

0

我猜問題是你的函數upload_to_some_where,因爲其餘代碼爲我工作得很好。出於測試目的,我稍微修改了您的代碼:

def get_temp_video(url, temp_file): 
    r = requests.get(url, stream=True) 
    for chunk in r.iter_content(chunk_size=1024): 
     if chunk: 
      temp_file.write(chunk) 
    return temp_file 


def get_frame(video_url): 
    named_temp_file = NamedTemporaryFile() 
    named_temp_file = get_temp_video(video_url, named_temp_file) 
    named_temp_file.seek(0) 
    video = cv2.VideoCapture(named_temp_file.name) 
    while video.isOpened(): 
     ret, frame = video.read() 
     if ret: 
      # For testing purpose 
      cv2.imshow("frame", frame) 
      if cv2.waitKey(25) == ord('q'): 
      break 
      ############################## 
      # temp_file = TemporaryFile() 
      # np.save(temp_file, frame) 
      # temp_file.seek(0) 
      # upload_to_some_where(temp_file.read()) 
      # temp_file.close() 
     else: 
      break 
    video.release() 
    named_temp_file.close() 

if __name__=='__main__': 

    get_frame('http://samples.mplayerhq.hu/MPEG-4/MPEG4%20by%20philips.mp4') 
+0

感謝您的回答。我發現錯誤在哪裏。就像你的回答,upload_to_some_where函數中的某些邏輯是錯誤的, –

相關問題