2

ネットワーク経由で 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) のいくつかのオプションを変更しようとしましたが、何も変更されません。

4

0 に答える 0