私はffmpegのでH264をデコードしたいのですが、最終的に私は、デコード機能は、1つのCPUコアのみFFMpegマルチスレッドの使い方は?
を使用した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でマルチスレッドを使用するにはどうすればよいですか?アドバイスはありますか?
より多くのコードを表示する必要があります。使用されているコアの数はどのように測定していますか?どのようにフレームをデコードしますか? FFmpegのどのバージョン?どのようにpCodecParserCtxを割り当てましたか? –
recv rtp streamは、最初にboost asioを使用してから、ffmpegでデコードし、openglで表示します。私はいくつかの解析とデコードのコードを追加しました。私はちょうどビデオをデコードし、ディスプレイがない場合、コアの使用を測定するためにシステムモニタを見ています。 –