前回、gstreamingを用いたrtpでのカメラ映像の配信・受信を行いました。
ですが、前回の方法ですとコマンドベースでの動作でした。
elsammit-beginnerblg.hatenablog.com
今度はgo言語でrtpで送信されたデータを受信してみたいと思います!!
go言語でgstreamingを実施するにあたって、gocv用います。
gocvのインストール手順はこちらを参考ください。
elsammit-beginnerblg.hatenablog.com
■事前準備
gocvを用いるにあたり、デフォルトだとgstreamerがOFF(無効)になっているようです。
このため、gstreamerを有効にする必要があり、再度ビルドしなおす必要があります。
まずはgstreamerを有効にするために設定を変更します。
gocv.io/x/gocv配下に格納された"travis_build_opencv.sh"を変更・追加します。
cmake -D WITH_IPP=${GRAPHICAL} \ -D WITH_OPENGL=${GRAPHICAL} \ -D WITH_QT=${GRAPHICAL} \ -D BUILD_EXAMPLES=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_PERF_TESTS=OFF \ -D BUILD_opencv_java=OFF \ -D BUILD_opencv_python=OFF \ -D BUILD_opencv_python2=OFF \ -D BUILD_opencv_python3=OFF \ -D OPENCV_GENERATE_PKGCONFIG=ON \ -D CMAKE_INSTALL_PREFIX=$HOME/usr \ -D OPENCV_ENABLE_NONFREE=ON \ -D WITH_FFMPEG=OFF \ ←OFFに変更. -D WITH_GTK=ON \ ←追加. -D WITH_GSTREAMER=ON \ ←追加. -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${OPENCV_VERSION}/modules ..
-D WITH_FFMPEG=OFF
は不要かもしれませんが、、、
どうやら、FFMPEGとGSTREAMERが両方ONになっていると動作不安定になるとのことで念のため。
修正変更したら、
sudo make install
を実行してgocvのビルドとインストールを行います。
インストール成功したら動作確認!!
■動作確認
では動作確認を行います。
まずはこちらのコードを実行。
package main import ( "fmt" "gocv.io/x/gocv" ) func main() { test := "videotestsrc ! videoconvert ! appsink" webcam, _ := gocv.OpenVideoCapture(test) window := gocv.NewWindow("Hello") img := gocv.NewMat() for { if ok := webcam.Read(&img); !ok { fmt.Printf("cannot read device \n") return } if img.Empty() { continue } window.IMShow(img) if window.WaitKey(1) >= 0 { break } } }
こちらの映像が表示されればOKです。
こちらのコードですが、OpenVideoCaptureに与えるデータを
test := "videotestsrc ! videoconvert ! appsink"
としており、gstreamerで用意?されたテスト動画をinputとして与えています。
後は、
webcam.Read(&img)
でフレーム映像を取得、
window.IMShow(img)
で映像表示しております。
この
test := "videotestsrc ! videoconvert ! appsink"
を、
test := "v4l2src! videoconvert ! appsink"
に置き換えればカメラ映像を表示させることが出来ます。
■rtp配信動画受信
セットアップが出来たので、本題のrtp配信動画を扱っていきます。
まずは、送信されてきた動画データの受信です。
まずはコードから。
package main import ( "fmt" "gocv.io/x/gocv" ) func main() { test := "udpsrc port=5005 ! application/x-rtp,media=video,encoding-name=H264 ! queue ! rtph264depay ! avdec_h264 ! videoconvert ! appsink" webcam, _ := gocv.OpenVideoCapture(test) window := gocv.NewWindow("Hello") img := gocv.NewMat() for { if ok := webcam.Read(&img); !ok { fmt.Printf("cannot read device \n") return } if img.Empty() { continue } window.IMShow(img) if window.WaitKey(1) >= 0 { break } } }
先ほどの動作確認とほぼほぼ同じコードで実現できますw。
異なる点は、
test := "udpsrc port=5005 ! application/x-rtp,media=video,encoding-name=H264 ! queue ! rtph264depay ! avdec_h264 ! videoconvert ! appsink"
で、データ受信先を
udpsrc port=5005
に変更し、エンコードを
application/x-rtp,media=video,encoding-name=H264 ! queue ! rtph264depay ! avdec_h264 ! videoconvert
としている点です。
前回のrtp受信コマンドで用いたコードをそのまま入力すれば実行できます。
事前に、
gst-launch-1.0 -v videotestsrc ! videoscale ! video/x-raw,width=160,height=120 ! videorate ! video/x-raw,framerate=100/1 ! x264enc ! rtph264pay ! udpsink host=127.0.0.1 port=5005 sync=false
を実行し、先ほどのコードを実行すると、
が表示されるかと思います。
■最後に
go言語でgstreamerを用いた映像受信方法についてまとめました。
送信側はただいま勉強中。