我目前正在开发一个应用程序,该应用程序使用Qt Designer工具以及C++下的V4L2和ffmpeg库在Linux上从网络摄像头捕获视频,为了捕获图像,使用libV4L2没有问题,由于图片已经准备好,我将其发送到基于ffmpeg-libs的编码器,最初编码器创建一个视频文件,并且它接收图像并将其编码在此文件中,我的问题如下:编码通常是完成的,但在我开始播放录制的视频文件之后,与常规速度相比,速度似乎加快了!很明显,问题出在视频编码上,我的问题是,有没有一种方法或功能可以管理ffmpeg编码速度的图片?????谢谢你的帮助。
使用FFMpeg创建自定义编码视频时,实际上需要在写入输出文件的每个AVPacket上设置PTS。设置AVCodecContext的time_base只会告诉容器期望什么。PTS(演示时间戳(告诉解码器(当您观看视频时(何时实际显示该特定帧。
例如:
我有一个AVFrame,我从FFMpeg的V4L2部分得到。首先,使用av_picture_copy复制此图像更安全。(因此编码器不会查看AVFrame结构中的所有额外信息。(
av_picture_copy( (AVPicture*) picture, (AVPicture*) pFrame, c->pix_fmt, c->width, c->height );
picture->pts = numFrames;
现在根据编码帧的数量设置pts
pDestFrame->pts = numFrames;
现在编码
numEncodedBytes = avcodec_encode_video( AVCodecCtx, buffer, bufferSize, pDestFrame );
现在创建一个AVPacket并在重新缩放后再次设置时间戳
AVPacket pkt;
av_init_packet(&pkt);
pkt.pts = av_rescale_q( c->coded_frame->pts, c->time_base, mpVideoStr->time_base );
if ( c->coded_frame->key_frame ) pkt.flags |= AV_PKT_FLAG_KEY;
pkt.stream_index = mpVideoStr->index;
pkt.data = outbuf;
pkt.size = out_size;
最后,你可以把数据包写出来
av_write_frame( formatCtx, &pkt );
我知道这适用于H264视频编码,但我不能100%确定它适用于其他类型的视频,因为我写这篇文章时只关心H264。
我认为您需要为图片添加时间戳
FFMpeg将尽可能快地进行编码/解码。您需要自己编写同步。通常在视频解码和播放中,你会在帧上附加时间戳,或者至少你可以用音频时钟和帧速率创建一些时间戳
但这在很大程度上取决于您希望如何同步以及如何实现。
也许FFMpeg的教程会给你一些额外的提示
创建ffmpeg文件时,必须指定帧速率取决于您使用的库,但要查找类似的库
pCodecContext->time_base.den = frames_per_second;
pCodecContext->time_base.num = 1;
否则,如果你从网络摄像头生成10-15fps,但文件中的默认值是30fps,它将快速播放。
请参阅http://code.google.com/p/qtffmpegwrapper/对于Qt-ffmpeg包装