昨天要在視頻轉發程序里增加轉碼功能:就是將輸入(流/文件)轉碼成指定格式的視頻流和音頻流。
研究了一下,發現vlc里自帶了轉碼功能,只不過參數設置比較麻煩。
我們具體的需求是:
輸入:rtsp流或者udp組播數據(對設置轉碼參數來說,其實沒有區別)
輸出:H264視頻(644k)+mp2音頻(56k),總碼率700k,ts封裝,使用udp轉發到本地單播
調用libvlc時的完整轉碼參數為:
sendudp = "--sout=#duplicate{dst=\"transcode{venc=x264{profile=baseline},vcodec=h264,acodec=mpga,vb=644,ab=56}:std{access=udp,mux=ts,dst=127.0.0.1:" + m_strport + "}\"}"
如果是直接使用vlc播放器來轉碼,命令行為:
vlc udp://@230.0.0.1:8001 --sout '#duplicate{dst="transcode{venc=x264{profile=baseline},vcodec=h264,acodec=mpga,vb=644,ab=56}:std{access=udp,mux=ts,dst=127.0.0.1:18009}"}'
考慮到以后轉碼參數可能會發生變化,就把它做到配置文件中了,用戶在使用時可以按需求配置相應的轉碼參數,不配值的話則不進行轉碼。
這樣,我們在啟動libvlc進行轉發(轉碼)時的代碼如下:
1 void CInputVideoVLC::InitVlc(int localport)
2 {
3 string m_strport = "";
4 string sendudp = "";
5 m_strport = CStringExt::Int2String(localport);
6 //sendudp = "--sout=#duplicate{dst=std{access=udp,mux=ts,dst=127.0.0.1:" + m_strport + "}}";
7
8 //transcode
9 sendudp = "--sout=#duplicate{dst=\"";
10 //sendudp += "transcode{venc=x264{profile=baseline},vcodec=h264,acodec=mpga,vb=644,ab=56}:";
11 sendudp += m_strTranscode;
12 sendudp += "std{access=udp,mux=ts,dst=127.0.0.1:" + m_strport + "}\"}";
13
14 const char * const vlc_args[] = {
15 "-I", "dummy", // Don't use any interface
16 "--ignore-config", // Don't use VLC's config
17 "--extraintf=logger", //log anything
18 "--verbose=0", //be much more verbose then normal for debugging purpose
19 "--repeat",
20 sendudp.c_str()
21 };
22 //printf("sendudp:%s\n", sendudp.c_str());
23
24 libvlc_exception_init(&_vlcexcep); //Initialize an exception structure
25 _vlcinstance = libvlc_new(sizeof (vlc_args) / sizeof (vlc_args[0]), vlc_args, &_vlcexcep); //Calculation character space
26 raise(&_vlcexcep);
27 _mp = libvlc_media_player_new(_vlcinstance, &_vlcexcep); //Create an empty Media Player object
28 raise(&_vlcexcep);
29 }
具體的轉碼參數說明,可以查看vlc文檔:http://www.videolan.org/doc/streaming-howto/en/ch03.html
以及相關示例:http://www.videolan.org/doc/streaming-howto/en/ch04.html
還可以參考:http://www.cnitblog.com/buf/archive/2011/08/06/74993.html