# Gstreamer framerate ## 1. Build Gstreamer ### Steps ``` # install a few dependencies sudo pip3 install ninja sudo apt-get install cmake meson flex bison sudo apt-get install libglib2.0-dev libjpeg-dev libx264-dev sudo apt-get install libgtk2.0-dev libcanberra-gtk* libgtk-3-dev # for omx sudo apt-get install libglfw3-dev libgles2-mesa-dev # needed for alsasrc, alsasink (currently not needed) sudo apt-get install libasound2-dev # start building export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/vc/lib/pkgconfig/ meson builddir -D omx=enabled -D gst-omx:target=rpi ninja -C builddir ``` ### Problems ``` # "config.h" not found create an empty one. # library 'GLESv2' not found sudo apt-get install libglfw3-dev libgles2-mesa-dev # 'OMX_IndexConfigBrcmVideoRequestIFrame' undeclared ln -s /opt/vc/include/IL/OMX_Index.h gst-omx/omx/openmax/OMX_Index.h ``` ## 2. Raspberry Pi Build Image 1. 用 Win32DiskImager 將SD卡內的資料轉成.img檔 2. 但此時檔案大小會跟SD卡容量相等,需再使用 pishrink 對此.img檔進行壓縮 3. **還原系統:** 使用Raspberry Pi Imager,在 CHOOSE OS 中點選"Use Custom"並選取此.img檔 ## 3. Test System (original,改omx264enc) #### 進入編譯好的gstreamer環境 (進入後即可使用 gst-launch-1.0 等相關指令): ``` ninja -C builddir devenv ``` #### rpi 發送端: ``` gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720,framerate=60/1 ! videoconvert ! 'video/x-raw, framerate=60/1,width=(int)1280, height=(int)720, format=(string)I420' ! queue ! omxh264enc target-bitrate=2000000 control-rate=variable ! h264parse ! rtph264pay ! queue ! udpsink host=<receiving-ip-addr> port=5001 ``` rpi3不太支援 v4l2src,暫時改成rpicamsrc: ``` gst-launch-1.0 rpicamsrc bitrate=2000000 ! video/x-raw,width=1280,height=720,framerate=60/1 ! videoconvert ! 'video/x-raw, framerate=60/1,width=(int)1280, height=(int)720, format=(string)I420' ! queue ! omxh264enc target-bitrate=2000000 control-rate=variable ! h264parse ! rtph264pay ! queue ! udpsink host=<receiving-ip-addr> port=5001 ``` #### 接收端: ``` gst-launch-1.0 -v udpsrc port=5001 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96" ! rtph264depay ! decodebin ! videoconvert ! autovideosink ``` ## 4. videorate [官方文件](https://gstreamer.freedesktop.org/documentation/videorate/index.html?gi-language=c) [原始程式碼]( https://github.com/GStreamer/gst-plugins-base/blob/master/gst/videorate/gstvideorate.c) [降fps反而提升CPU使用率問題](https://stackoverflow.com/questions/40094280/why-does-decreasing-the-framerate-with-videorate-incur-a-significant-cpu-perform) * drop-only=true 開啟後,程式不會duplicate,只會drop frame,因此可以吧處理延遲降到0。 * in, out, drop 這幾個參數只是用來 log 已讀進、讀出、丟掉了幾張照片。其餘的參數保持預設值就好。 測試指令: ``` gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=720,framerate=60/1 ! videoconvert ! videorate drop-only=true ! 'video/x-raw, framerate=15/1,width=(int)1280, height=(int)720, format=(string)I420' ! queue ! omxh264enc target-bitrate=2000000 control-rate=variable ! h264parse ! rtph264pay ! queue ! udpsink host=<receiving-ip-addr> port=5001 ```