我目前正在开发一个应用程序,它使用Qt Designer工具和Linux下的V4L2和ffmpeg库从Linux上的网络摄像头捕获视频,捕获图像使用lib V4L2没有问题,并且因为那是一张图片准备好了我把它发送到基于ffmpeg libs的编码器,最初编码器创建一个视频文件,它接收图像在这个文件中编码,我的问题如下:编码通常完成,但如果我开始播放录制的视频文件,速度似乎比常规速度加速!那么很明显,问题在于视频编码, 我的问题是,是否有管理ffmpeg编码速度图片的方法或功能????? 谢谢你的帮助。
答案 0 :(得分:1)
使用FFMpeg创建自定义编码视频时,您实际上需要在每个写入输出文件的AVPacket上设置PTS。设置AVCodecContext的time_base只会告诉容器期望的内容。 PTS(演示时间戳)告诉解码器(当您观看视频时)何时实际显示该特定帧。
例如:
我有一个从FFMpeg的V4L2部分获得的AVFrame。首先,使用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。
答案 1 :(得分:0)
我认为您需要为照片添加时间戳
FFMpeg将尽可能快地进行编码/解码。您需要自己编写同步。通常在视频解码和播放中,您的帧上附有时间戳,或者至少可以使用音频时钟和帧速率创建一些时间戳。
但这在很大程度上取决于您希望如何同步以及如何实施它
也许FFMpeg的tutorial会给你一些额外的提示
答案 2 :(得分:-1)
创建ffmpeg文件时,必须指定帧速率 取决于您使用的库,但查找类似
的内容pCodecContext->time_base.den = frames_per_second;
pCodecContext->time_base.num = 1;
否则,如果您从网络摄像头生成10-15fps,但文件中的默认值为30 fps,则会快速播放。
有关Qt ffmpeg包装器的信息,请参阅http://code.google.com/p/qtffmpegwrapper/