1

我目前正在使用来自 Hauppauge WinTV950Q 的实时视频输入,它为我提供了实时视频输入。

我正在使用libav*andQt库并C/C++在 Linux 上编程。我使用推荐avcodec_open_input()的打开和处理(转码)输入以在移动设备上使用。我希望能够在我的移动设备上观看电视,并且能够远程切换频道。到目前为止一切正常。

我唯一的问题是打开输入需要 5 到 20 秒。这对于我的用例来说会变慢,我可以接受 1-3 秒之间的延迟。我以前用于第一次测试的 v4l2-API 实际上设法获得 1-3 秒之间的切换时间,但我不能使用它,因为我需要进行一些转码,以便可以在移动设备上使用视频数据。

有没有办法提高avformat_open_input()通话的开放时间?也许在打开输入之前需要设置库中的一些全局变量?

这是相关的代码:

const char* filename = "/dev/dvb/adapter0/dvr0";

int main(void)
{
    /*Qt-Variables*/
    QTime timer;
    /*General AV-IO*/
    int i, videoStream, audioStream, frameFinished;
    AVFormatContext *ptrFormatContext;
    AVPacket ptrPacket;
    /*Audio related*/
    AVCodecContext  *aCodecCtx;
    AVCodecContext  *aTargetCodecCtxt;
    AVCodec         *aCodec;
    AVCodec         *aTargetCodec;
    uint8_t         *audio_samples;
    int             frame_size_ptr;
    //    AVSampleFormat  ptrSampleFormats[2] = {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32};

    /*Video related*/
    AVCodecContext *ptrCodecCtxt;
    AVCodecContext  *vTargetCodecCtxt;
    AVCodec *ptrCodec;
    AVCodec         *vTargetCodec;
    AVFrame *ptrFrame;

    /*Default Initialization of Variables*/
    audioStream = videoStream = -1;
    audio_samples = NULL;


    /*Registering and initialization of the libav* codecs, formats, filter etc.*/

    qDebug("Registering Codecs, Filter, Formats, Media Libraries etc...");
    timer.start();
    av_register_all();
    avcodec_register_all();
    qDebug()<<"Elapsed(ms): "<<timer.elapsed();

    /*Assigning a memory array to the Format Context and the Frame for the Video decoding, now we can start working*/
    qDebug("Allocating Codec Context and Frames for main Input...");
    timer.start();
    ptrFrame = avcodec_alloc_frame();
    ptrFormatContext = avformat_alloc_context();
    qDebug()<<"Elapsed(ms): "<<timer.elapsed();

    /*Opening the Live Video Input, sometimes very slow.*/
    qDebug("Trying to open the Input...");
    timer.start();
    if(avformat_open_input(&ptrFormatContext, filename, NULL, NULL) != 0 )
    {
        qDebug("Error opening the input");
        exit(-1);
    } else qDebug()<<"Elapsed(ms): "<<timer.elapsed();

这是输出:

Registering Codecs, Filter, Formats, Media Libraries etc...
Elapsed(ms):  0 
Allocating Codec Context and Frames for main Input...
Elapsed(ms):  0 
Trying to open the Input...
Elapsed(ms):  14752 
4

1 回答 1

0

Not sure if this will help you, I am quite a libavcodec n00b :)

Try setting max_analyze_duration on the ptrFormatContext to a low value...

I have successfully used this to speed up opening of live mjpeg streams

于 2012-03-26T10:40:50.270 回答