Быстрый способ открытия Live Input с помощью libavcodec - PullRequest
1 голос
/ 22 января 2012

В настоящее время я работаю с живым видеовходом от 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 

1 Ответ

0 голосов
/ 26 марта 2012

Не уверен, поможет ли это вам, я довольно libavcodec n00b:)

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

Я успешно использовал это дляускорить открытие живых потоков mjpeg

...