2017-04-06 91 views
1

私はffmpegのでH264をデコードしたいのですが、最終的に私は、デコード機能は、1つのCPUコアのみFFMpegマルチスレッドの使い方は?

を使用した

system monitor

ENV:Ubuntuの14.04 FFMPEGは3.2.4 CPUは


だから、私は検索i7-7500U ffmpegマルチスレッディングを行い、すべてのCPUコアを使用してデコードすることを決定します。
私はこのようAVCodecContextを設定します。

//Init works 
//codecId=AV_CODEC_ID_H264; 
avcodec_register_all(); 
pCodec = avcodec_find_decoder(codecId); 
if (!pCodec) 
{ 
    printf("Codec not found\n"); 
    return -1; 
} 
pCodecCtx = avcodec_alloc_context3(pCodec); 
if (!pCodecCtx) 
{ 
    printf("Could not allocate video codec context\n"); 
    return -1; 
} 

pCodecParserCtx=av_parser_init(codecId); 
if (!pCodecParserCtx) 
{ 
    printf("Could not allocate video parser context\n"); 
    return -1; 
} 
pCodecCtx->thread_count = 4; 
pCodecCtx->thread_type = FF_THREAD_FRAME; 

pCodec->capabilities &= CODEC_CAP_TRUNCATED; 
pCodecCtx->flags |= CODEC_FLAG_TRUNCATED; 

if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) 
{ 
    printf("Could not open codec\n"); 
    return -1; 
} 
av_log_set_level(AV_LOG_QUIET); 
av_init_packet(&packet); 

//parse and decode 
//after av_parser_parse2, the packet has a complete frame data 
//in decode function, I just call avcodec_decode_video2 and do some frame copy work 
while (cur_size>0) 
{ 
    int len = av_parser_parse2(
        pCodecParserCtx, pCodecCtx, 
        &packet.data, &packet.size, 
        cur_ptr, cur_size, 
        AV_NOPTS_VALUE, AV_NOPTS_VALUE, AV_NOPTS_VALUE); 

    cur_ptr += len; 
    cur_size -= len; 
    if(GetPacketSize()==0) 
     continue; 

    AVFrame *pFrame = av_frame_alloc(); 
    int ret = Decode(pFrame); 
    if (ret < 0) 
    { 
     continue; 
    } 
    if (ret) 
    { 
     //some works 
    } 
} 

しかし、前と違う何も。
FFMpegでマルチスレッドを使用するにはどうすればよいですか?アドバイスはありますか?

+0

より多くのコードを表示する必要があります。使用されているコアの数はどのように測定していますか?どのようにフレームをデコードしますか? FFmpegのどのバージョン?どのようにpCodecParserCtxを割り当てましたか? –

+0

recv rtp streamは、最初にboost asioを使用してから、ffmpegでデコードし、openglで表示します。私はいくつかの解析とデコードのコードを追加しました。私はちょうどビデオをデコードし、ディスプレイがない場合、コアの使用を測定するためにシステムモニタを見ています。 –

答えて

1

pCodec-> capabilities & = CODEC_CAP_TRUNCATED;

そして、それはあなたのバグです。この行を削除してください。 avcodec_find_decoder()の戻り値は、すべての実用的な目的と目的のためにconstとみなされるべきです。

具体的には、この文は、このように効果的にコードの残りの部分でフレーム・マルチスレッドを無効にし、コーデックの能力からAV_CODEC_CAP_FRAME_THREADSフラグを削除します。

+0

あなたは正しいです、ここではバグです。 –

関連する問題