使用libavcodec快速打开实时输入的方法

时间:2012-01-21 23:09:10

标签: libavcodec libav libavformat

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

我正在使用libav*Qt库,并在Linux上C/C++编程。我使用推荐的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 

1 个答案:

答案 0 :(得分:0)

不确定这是否对您有帮助,我是一个libavcodec n00b:)

尝试将ptrFormatContext上的max_analyze_duration设置为较低的值...

我已经成功地使用它来加速实时mjpeg流的开放