ffmpeg速度编码问题

时间:2011-05-02 14:24:21

标签: ffmpeg encoder

我目前正在开发一个应用程序,它使用Qt Designer工具和Linux下的V4L2和ffmpeg库从Linux上的网络摄像头捕获视频,捕获图像使用lib V4L2没有问题,并且因为那是一张图片准备好了我把它发送到基于ffmpeg libs的编码器,最初编码器创建一个视频文件,它接收图像在这个文件中编码,我的问题如下:编码通常完成,但如果我开始播放录制的视频文件,速度似乎比常规速度加速!那么很明显,问题在于视频编码, 我的问题是,是否有管理ffmpeg编码速度图片的方法或功能????? 谢谢你的帮助。

3 个答案:

答案 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/