ネットワーク経由で H264 RTP ストリームがあり、それをデコードする必要があります。libx264 を使用してストリームをエンコードし、ffmpeg を使用してデコードします。VLC を使用してサーバーに接続すると、ビデオの再生が問題なく修正されます。しかし、アプリケーションを使用してサーバーに接続すると、このストリームからビデオを描画するウィジェットが画像を 1 つだけ描画する時間が長くなります。
ログ ファイルを確認したところ、avcodec_decode_video2() が got_image を 1 に設定することはめったにありません。デコーダーは1〜2秒ごとに新しいデコードされたフレームの平均を提供しますが、サーバーではエンコーダーで12〜15 fpsです!
このデコーダーの遅延の理由と、その修正方法を教えてください。
avcodec_register_all();
av_init_packet(&m_packet);
m_decoder = avcodec_find_decoder(CODEC_ID_H264);
if (!m_decoder)
{
QString str = QString("Can't find H264 decoder!");
emit criticalError(str);
}
m_decoderContext = avcodec_alloc_context3(m_decoder);
m_decoderContext->flags |= CODEC_FLAG_LOW_DELAY;
m_decoderContext->flags2 |= CODEC_FLAG2_CHUNKS;
AVDictionary* dictionary = nullptr;
if (avcodec_open2(m_decoderContext, m_decoder, &dictionary) < 0)
{
QString str = QString("Failed to open decoder!");
emit criticalError(str);
}
qDebug() << "H264 Decoder successfully opened";
m_picture = avcodec_alloc_frame();
...
while(m_packet.size > 0)
{
int got_picture;
int len = avcodec_decode_video2(m_decoderContext, m_picture, &got_picture, &m_packet);
if (len < 0)
{
QString err("Decoding error");
qDebug() << err;
//emit criticalError(err);
return false;
}
if (got_picture)
{
//create from frame QImage and send it into GUI thread
qDebug() << "H264Decoder: frame decoded!";
m_decoderContext (つまり、thread_count) のいくつかのオプションを変更しようとしましたが、何も変更されません。