我目前正在使用来自 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