gstreamer經常使用命令

因爲有好一段時間沒作GStreamer相關項目了,早前的一些記錄須要作下記錄,以待須要的時候查閱。linux

仍是分幾個小節來介紹吧,這樣思路清晰一點。(格式有點亂,沒時間整理,讀者自行腦補)ios

1. 播放視頻、音頻vim

  音頻:gst-launch-1.0 filesrc loaction=123.mp3 ! mad ! autoaudiosink    網絡

  //補充說明:autoaudiosink可換成pulsesink或alsasink,須要使用gst-inspect查詢是否存在這些sink插件,其實autoaudiosink是個殼,最終仍是選擇使用後二者之一。tcp

  視頻:gst-launch-1.0 filesrc location=320_240.mp4 ! qtdemux ! sprdavcdec ! autovideosinkide

  //補充說明:autovideosink默認使用ximagesink。ximagesink兼容性較好,但耗資源,xvimagesink兼容性差,因缺少顯卡支持會失敗,但效率高。ui

  其餘:gst-launch-1.0 filesrc location=abc.mp4 ! qtdemux name=demux demux.video_0 ! queue ! decodebin ! videoconvert ! videoscale ! autovideosink //只分離視頻並播放編碼

     gst-launch-1.0 filesrc location=3.mp4 ! decodebin ! autovideoconvert ! autovideosink   //只解碼和顯示視頻部分,音頻過濾掉,decodebin使用着最簡單方便
  //補充:gstreamer好像不能分離出可播的264裸碼流,可是能夠用ffmpeg轉:ffmpeg.exe -i 320_240.mp4 -vcodec copy -an 320_240.h264spa

2. 視頻、音頻編碼插件

  視頻:gst-launch-1.0 v4l2src device="/dev/video0" ! "video/x-raw, width=1920, height=1080" ! omxh264enc ! "video/x-h264, stream-format=byte-stream" ! h264parse ! qtmux ! filesink location=test.mp4

  音頻:gst-launch-1.0 audiotestsrc ! audioconvert ! "audio/x-raw,format=S16LE,channels=2,rate=8000" ! lamemp3enc ! filesink location=audio_conv.mp3

             gst-launch-1.0 xxx.mp3 ! mad ! audioconvert ! lamemp3enc ! filesink location=xxx_mad_lame.mp3   //mad只解碼出S32LE的格式,lame只支持S16LE的格式,所以必須經過audioconvert來轉換

3. 攝像頭預覽

  gst-launch v4l2src ! video/x-raw-yuv,width=320,height=240,framerate=20/1 ! autovideosink

  說明:v4l2src即圖形源,若是不帶此插件,能夠用videotestsrc替代

4. 轉碼(avc->yuv, mp3/aac->pcm)

  avc->yuv:gst-launch-1.0 filesrc location=attachment.mkv ! matroskademux ! avdec_h264 ! filesink location=tmp.yuv //注意,生成的yuv的size會很是大,mkv中的視頻爲h264格式

  avc->yuv->sinkgst-launch-1.0 filesrc location=dgld.mp4 ! qtdemux ! avdec_h264 ! videoconvert  ! video/x-raw,format=I420 ! autovideosink

  mp3->wav:gst-launch-1.0 filesrc location=1.mp3 ! mad ! wavenc ! filesink location=1.wav  //mad解碼出來是32bit的pcm數據,不是S16LE格式的,wavenc實際上是對pcm數據編碼+封裝的過程,由於要有32->S16LE和加wave_header的過程

  aac->wav->sink:gst-launch-1.0 filesrc location=out.aac ! aacparse ! avdec_aac ! audioconvert ! alsasink   //aac文件到解碼之間必需要有一個aacparse,而MP3沒有,是由於AAC的ADTS、ADIF容器格式文件致使的吧

5. 經常使用的一些插件介紹

  h265解碼,社區提供了兩個插件:avdec_h265,de265,前者爲ffmpeg項目提供的,後者爲德國一家公司提供的插件+解碼庫

  avdec_xxx爲ffmpeg項目組提供的解碼插件方案,例如avdec_h26四、avdec_aac

  xxmux爲文件封裝插件,如qtmux(不要理解爲作UI庫的QT公司,而是mp4封裝,即蘋果公司推出的QuickTime符合mp4規範的)

  xxdemux爲解封裝插件

6. filter相關

  crop處理:gst-launch-1.0 -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink //videocrop——裁邊,能夠處理解碼器將width/height強制32或64對齊而引入的右側/底部的灰邊,其值表示裁掉多少像素。

7. 網絡推流/拉流(兩個終端下執行)

  gst-launch-1.0 tcpserversrc host="127.0.0.1" port=3000 ! decodebin ! autoaudiosink
  gst-launch-1.0 filesrc location=./1.mp3 ! tcpclientsink host="127.0.0.1" port=3000

8. jpeg相關

  mjpeg文件解碼+顯示:gst-launch-1.0 filesrc location=test_mjpeg.mp4 ! qtdemux ! jpegdec ! videoconvert ! autovideosink
  mjpeg文件解碼+多文件保存:gst-launch-1.0 filesrc location=test_mjpeg.mp4 ! qtdemux ! jpegdec ! multifilesink location=%02d.yuv

  jpeg解碼+顯示:gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! videoconvert ! imagefreeze ! ximagesink //解碼後顯示,必須用imagefreeze和videoconvert插件,在PC上驗證結果。imagefreeze——將圖像凍結,不然很快消失。

 

  //yuv的顯示
  //如下不知道爲何顯示全黑色的圖像——log中出現了error信息!
  //把pixel-aspect-ratio和interlace-mod這兩個屬性去掉,由於videoconvert的SinkPad不帶這些屬性
  gst-launch-1.0 filesrc location=xxx.yuv ! "video/x-raw,format=I420,width=1280,height=720,pixel-aspect-ratio=1/1,framerate=0/1,interlace-mod=progressive" ! videoconvert ! imagefreeze ! ximagesink //yuv圖片的顯示
  //最終答案是,filesrc 添加文件大小的屬性:blocksize=xxx,表示數據源多大,來肯定讀多少數據來做爲一幀。
  //videoconvert的sink_pad,有的gst版本要求帶framerate的屬性,不然報錯
  gst-launch-1.0 filesrc blocksize=xxx location=xxx.yuv ! "video/x-raw,format=I420,width=1280,height=720" ! videoconvert ! imagefreeze ! ximagesink

 

  //yuv的jpeg編碼,前半部分同樣,後半部分進行編碼+寫文件
  gst-launch-1.0 filesrc blocksize=xxx location=xxx.yuv ! "video/x-raw,format=I420,width=1280,height=720" ! videoconvert ! jpegenc ! filesink location=yyy.jpg

  gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! imagefreeze ! glimagesink //解碼+顯示
  gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! filesink location=test.yuv //解碼+存本地文件
  gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! imagefreeze ! glimagesink //yuv顯示
  gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! jpegenc ! filesink location=test_enc.jpg //利用yuv文件編碼

 

  //解碼+顯示
  gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! imagefreeze ! glimagesink //能夠指定文件大小,使用blocksize=xxx

  //解碼+存本地文件
  gst-launch-1.0 filesrc location=test.jpg ! jpegdec ! filesink location=test.yuv

  //yuv文件顯示
  gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! imagefreeze ! glimagesink
  說明:blocksize指定test.yuv文件的大小,width=900,height=800指定yuv文件的實際寬高,必須填對!

  //利用yuv文件jpeg編碼
  gst-launch-1.0 filesrc blocksize=1081600 location=test.yuv ! video/x-raw,width=900,height=800,format=I420,framerate=0/1 ! videoconvert ! jpegenc ! filesink location=test_enc.jpg
  說明:blocksize指定test.yuv文件的大小

9. 其餘未歸類命令

  gst-launch-1.0 filesrc location=Capture001.png ! pngdec ! imagefreeze ! autovideosink
  gst-launch-1.0 filesrc location=Capture001.png ! pngdec ! filesink location=png.yuv

  gst-launch-1.0 filesrc location=320_240_hevc.mp4 ! qtdemux ! filesink location=320_240_gst_naked.hevc //跟ffmpeg分流後獲得的不太同樣,start_code中包含size信息

  gst-launch-1.0 filesrc location=320_240_hevc.mp4 ! qtdemux ! sprdhevcdec ! filesink location=320_240_hevc.yuv
  gst-launch-1.0 filesrc location=320_240_hevc.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
  gst-launch-1.0 filesrc location=bigbuckbunny_1080p_4mbps.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
  gst-launch-1.0 filesrc location=Movie_h265_NA.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
  gst-launch-1.0 filesrc location=02_Naturally_720p_x265.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink
  gst-launch-1.0 filesrc location=bigbuckbunny_1080p_4mbps_ffmpeg.mp4 ! qtdemux ! sprdhevcdec ! fakevideosink

10. 其餘未歸類命令

  用gstreamer的管道命令,太麻煩了,真不如ffmpeg用着方便啊!

  固然,其存在必然有其合理性,這是linux平臺下通用的多媒體中間件系統,多種播放器都是使用它來作的,它的一個很大特色是軟件分層、解耦、抽象作的很是好。

  若是要作一些插件,須要有一些基礎知識,例如gobjec,glib庫。

相關文章
相關標籤/搜索