2016-11-07 40 views
1

メモリバッファにx264ビデオ(またはシングルフレーム)を書き込む際に問題があります。画像のopencvでは、imencodeとimdecodeはこの作業を行います。しかし、私は低メモリ使用量とインターネットで送信するためのx264ビデオフレームを保存したい。私はjpegでできますが、jpegサイズはx264ビデオフレームと品質よりもずっと悪くなります。私は検索したが、バッファにビデオフレームを書き込む方法が見つからない。ここで Python-Opencvメモリバッファにx264ビデオを書き込む

は残念ながら

 import numpy as np 
     import cv2 


     cap = cv2.VideoCapture(0) 
     cap.set(3,320) 
     cap.set(4,240) 
     cap.set(5,30) 
     # Define the codec and create VideoWriter object 
     fourcc = cv2.VideoWriter_fourcc(*'x264') 
     out = cv2.VideoWriter('.....sample.avi',fourcc, 30.0, (320,240)) 

     while(cap.isOpened()): 
      ret, frame = cap.read() 
      if ret==True: 
       cv2.imshow('frame',frame) 
       out.write(frame) #I want to write memory not disk 
       if cv2.waitKey(1) & 0xFF == ord('q'): 
        break 
      else: 
       break 

     # Release everything if job is finished 
     cap.release() 
     out.release() 
     cv2.destroyAllWindows() 
+0

あなたは何を達成しようとしているのか分かりませんので少し詳しく説明できますか?イメージフレームを含むビデオファイルを作成しますか?または、他の何か?いずれにしても、AVIコンテナでx264がうまく動作しているかどうかわからない、代わりにMKVを試してみよう。 –

+0

実際には、udpまたはtcp/ipでネット上でカメラフレームを送信しようとしている。私はjpgイメージを正常に送信しました(1つのフレームが次のフレームを送信して送信します)。しかし、私はx264の圧縮mkvまたはaviビデオ(または1つのフレームを順番に)ファイルをjpgよりも効率的に圧縮するので、(私は思うより良い品質)x264をディスクに書き込むことができるが、私はメモリに書き込みたい配列..)x264のビデオフレーム私は(pickleまたはjson)ビデオフレームをシリアル化し、ソケットを介して送信する必要があります。私はネット上で検索したが、どうすればいいの?この説明ははっきりとしていると思います。これは私の問題です。 – faxcon

+0

OpenCVのpythonバージョンは単にピクルス、シリアライズ可能な行列にnumpyを使用しているので、これは可能ですか?OpenCV(C++とPythonの両方)はFFMPEG(libav)を使用します。同じように働くことはできません。コンテンツをストリーミングする前にコンテンツを修正する予定ですか?私。 OpenCVを実際に必要としているのですか、またはコンテンツを直接ストリーミングするために別のライブラリを使用することは可能でしょうか? –

答えて

2

ウェブカメラでコマずつ撮影するサンプルコードで、あなたがout.release前にエンコードされたビデオフレームを達することができないので、cv2.VideoWriterをどうする方法はありません

私は私のプロジェクトのために発見した方法は、Dからcap_ffmpeg_impl.hppを実施しています:\ your_directory \ OpenCVの\ソース\モジュール\のHighGUI \ SRC、そのライブラリーでキャプチャしたフレームを送信します。 UDPやTCP/IPでエンコードされたフレームを送信し、同じライブラリでどこに到達するのかをデコードします。また、右のffmpegバージョンをコンパイルする必要があります。

+0

このフレームをライブラリに送信するにはどうしたらよいですか? – faxcon

+0

opencvとx264ビデオコーデックを使って、ビデオストリーミングに** cap_ffmpeg_impl.hpp **を使用する[サンプルプロジェクト](https://github.com/dimitrs/video_coding/blob/master/test.cpp)が見つかります。 –

関連する問題