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