2015-11-03 73 views
0

我目前正在設置自己的輸出上下文這樣創建的.avi:C++的FFmpeg挑編解碼器從系統

avformat_alloc_output_context2(&outContext, NULL, NULL, "out.avi"); 
if (!outContext) 
    die("Could not allocate output context"); 

然而,由此產生的視頻質量是非常不愉快。因此,我希望能夠獲取系統上安裝的編解碼器,並在avformat_alloc_output_context2中使用其中的一個。類似如下:

Video codec picker

所以我想我的兩個問題是:

  1. 如何創建一個包含解壓安裝列表(陣列)(如上)?
  2. 如何在輸出容器中使用其中之一?

如果可能,我還希望能夠修改輸出質量(0%-100%)並打開編解碼器配置窗口。

回答

1

首先,請您用繩子(或其他)地圖AVCodecID,像這樣:

std::map<string, AVCodecID> _codecList; 
_codecList["h264"] = AV_CODEC_ID_H264; 
_codecList["mpeg4"] = AV_CODEC_ID_MPEG4; 
.... 

注意FFmpeg的不提供信息是哪種編解碼器在什麼容器可用,因此,你應該確認自己。但你可以參考以下鏈接(至少是officlal):https://en.wikipedia.org/wiki/Comparison_of_video_container_formats

接下來要做的就是通過名稱找到編碼器,或AVCodecID在下面的代碼:

avcodec_find_encoder_by_name("libx264"); 
avcodec_find_encoder(AV_CODEC_ID_H264); 

兩者都是回報avcodec中*

AVCodecID codec_id = (_codecList.find("h264") != _codecList.end()) ? 
          _codecList.find("h264") : AV_CODEC_ID_NONE; 
if(codec_id == AV_CODEC_ID_NONE) 
{ 
    return -1; 
} 

AVCodec* encoder = avcodec_find_encoder(codec_id); 
// or you can just get it from avcodec_find_encoder_by_name("libx264"); 

AVStream* newStream = avformat_new_stream(avFormatContext, encoder); 

THRE確定視頻質量時,有這麼多的事情:這樣你就可以撥打電話時avformat_new_stream(),像這樣使用。 X264,特別是有更多的選擇。在這種情況下,您可以通過crf值或比特率來列出它(不能同時使用這兩個選項)。你可以用AVCodecContext來確定它。

AVCodecContex* codec_ctx = newStream->codec; 
codec_ctx->bitrate = 1000000 // 1MB 
// codec_ctx->qmin = 18; 
// codec_ctx->qmin = 31; 

一旦你做了,與avcodec_open2

avcodec_open2(avFormatContext, encoder, NULL); 

打開它,不要忘了,當你釋放它關閉。

avcodec_close(avFormatContext); 

創建自己的輸出流時有很多事情要做。如果你有更深的經驗,我認爲這個答案就足夠了。

,但如果你沒有太多的經驗與FFmpeg的,你可以找到我的完整的例子在這裏(https://github.com/sorrowhill/FFmpegTutorial

+0

謝謝,但有沒有辦法來自動獲取解壓安裝的名單? – david

+0

我認爲這是不可能的。因爲有很多用於壓縮視頻或音頻的編解碼器。也許你可以數一數如果你正在使用包裝軟件,如FFmpeg。 –