Быстрый способ открытия Live Input с помощью libavcodec

В настоящее время я работаю с прямым видеовходом от Hauppauge WinTV950Q, который дает мне прямой видеовход.

Я использую библиотеки libav* и Qt и программирую на C/C++ в Linux. Я использую рекомендуемый avcodec_open_input() для открытия и обработки (транскодирования) ввода для использования на мобильных устройствах. Я хочу иметь возможность смотреть телевизор на своих мобильных устройствах, а также иметь возможность удаленно переключать каналы. Пока все работает нормально.

Моя единственная проблема в том, что открытие входа занимает от 5 до 20 секунд. В моем случае это медленно, я бы согласился с задержками от 1 до 3 секунд. API v4l2, который я ранее использовал для первых тестов, на самом деле позволяет получить время переключения между 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 

person mmoment    schedule 21.01.2012    source источник
comment
привет мммомент, ты все еще работаешь над этим? Я работаю над чем-то подобным; почти готов!   -  person pollux    schedule 27.07.2012
comment
Больше не работаю над этим, но, возможно, вы могли бы опубликовать свое решение, чтобы другие могли его использовать?   -  person mmoment    schedule 24.10.2014


Ответы (1)


Не уверен, что это поможет вам, я вполне себе libavcodec n00b :)

Попробуйте установить max_analyze_duration в ptrFormatContext на низкое значение...

Я успешно использовал это, чтобы ускорить открытие живых потоков mjpeg.

person major-mann    schedule 26.03.2012