基於gst-launch的實時轉碼

目標是實現一個實時轉碼,可用於IPTV提供節目源。
相關工作在ubuntu操作系統下進行。需要對源代碼進行修改的時候,直接採用apt-get source命令獲取源代碼,根據需要進行修改,然後安裝,這樣能最大限度的保證兼容性和穩定性。
命令行示例
gstreamer是通過不同功能的element構成pipeline的方式來工作的,一個transcoding也是通過解碼,編碼等各種element構成的pipeline來實現的。採用gstreamer的命令行工具就能實現各種複雜的轉碼功能,不過一個複雜的應用還是要通過編程來實現。下面是一個例子:
gst-launch-0.10 filesrc location=mpts.ts !
mpegtsdemux !
ffdec_mpeg2video !
ffenc_mpeg2video bitrate=3500000 !
ffmux_mpegts !
filesink location=m

輸入
    filesrc:文件。
    udpsrc:IP網絡,可以採用IP輸出的工程用數字電視接收機。
    v4lsrc:採集卡,測試過Osprey,微視圖像的採集卡
    v4lsrc:DVB數字電視卡,測試過衛星電視卡。
    v4lsrc:中國標準的DMB-TH地面數字電視接收卡,做過測試。
    v4lsrc:中國標準的ABS-S,中星九號衛星電視接收卡,沒有找到過合適的硬件。

輸出
    filesink:文件
    udpsink:IP網絡組播或者單播

    RTSPv


解複用
解複用選擇ffdemux_mpeg2ts,需要考慮到時間戳的問題,見《ffdemux_mpegts中時間戳的處理問題》

解碼
    ffdec_mpeg2video:ffmpeg的gstreamer插件,可以解碼多種格式,包括mpeg2,mpeg4,264,vp6等。
    mpeg2dec:用於mpeg2解碼。
對於解碼相對比較容易,要求不是很苛刻。

編碼
    x264enc:x264編碼,效率相當高,在4核的CPU上可以實現4路標清編碼。支持多線程編碼。
    ffenc_mpeg2video:ffmpeg的mpeg2編碼,效率比較高,在32位的ubuntu server 10.04.1上經過驗證效率較高,一個cpu核心接近兩個標清實時編碼,在64位的ubuntu server 10.10上則效率比較低。不支持多線程?
    mpeg2enc:支持多線程,但是效率明顯不如ffenc_mpeg2video。需要明確gop的大小,並明確需要在每個gop之前加入序列頭,否則這些都沒有,圖像質量不如ffmpeg的mpeg2video編碼,不支持interlaced。
因此對於264選擇x264enc,對於mpeg2應該選擇ffmpeg,但是需要增加對於多線程的支持,否則實時編碼的效果不理想,會經常出現馬賽克。

封裝
    ffmux_mpegts:mpegts封裝,不支持CBR封裝(在《視頻編碼中的碼率控制及應用》有如何添加CBR支持的描述)。PCR的計算比較精確,對於CBR是40ms,對於VBR是80ms。
    mpegtsmux:同樣是mpegts封裝,同樣不支持CBR封裝。PCR的計算比較粗,抖動非常厲害。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章