2011-05-02 94 views
1

我目前正在开发一个应用程序,使捕获视频从使用Qt Designer工具和v412和ffmpeg的库C + +,来捕捉图像有使用LIB V4L2没有问题,并且在Linux上的一个摄像头因为这一张照片好了,我将它发送到基于FFMPEG库编码器,最初该编码器创建的视频文件,并将其接收图像编码它在这个文件中,我的问题是:编码的正常进行,但是如果我开始播放录制的视频文件后,与普通速度相比,速度似乎会加快!那么有什么清楚的,问题是在视频编码方面,我的问题是 ,有没有一种方法或函数来管理ffmpeg编码速度图片? 感谢您的帮助。ffmpeg的高速编码问题

+0

所以你的问题与C++或Qt无关,请适当标记。 – jv42 2011-05-02 14:26:48

+0

我只是想说明我的问题,因为我使用Qt,使用C++语言编程。 – amrouch 2011-05-03 09:29:10

+0

但是只有C++和Qt知识的人不能帮助你,尽管他们可能会'监视'那些标签。 – jv42 2011-05-03 09:30:07

回答

1

当创建与FFmpeg的自定义编码的视频见http://code.google.com/p/qtffmpegwrapper/,您实际上需要设置PTS对被写入到输出文件中的每个AVPacket。设置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; 

现在设置基于编码的帧

pDestFrame->pts = numFrames; 

的NUM的PTS现在编码

numEncodedBytes = avcodec_encode_video(AVCodecCtx, buffer, bufferSize, pDestFrame); 

NOW创建一个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当我写这个。

0

我认为你需要给你的照片添加时间戳。
FFMpeg将尽可能快地进行编码/解码。你需要自己写一个同步。通常在视频解码和播放时,您的时间戳会附加到您的帧中,或者至少您可以使用音频时钟和帧速率创建一些时间戳。
但这很大程度上取决于您想要如何同步以及如何实现它。
也许FFmpeg中的tutorial给你一些additionl暗示

+0

我已经看过这个教程,但是这个专门用于解码功能,我的解码器工作正常,更重要的是,我只是捕获视频流,没有音频,使它更容易,这就是为什么我强烈认为问题是在解码器,目前,我正在修改编码器中的点数,特别是formatcontext,数据包...... – amrouch 2011-05-03 10:33:08

+0

您可以在tut中看到如何完成同步。在这种情况下,视频如何同步到音频。在你的情况下,我假设没有音频。所以你需要确定视频帧需要显示多长时间。例如,通过对每个帧使用帧速率或持续时间。 – mkaes 2011-05-03 11:34:52

+0

对不起,我的意思是问题出在“ENCODER”,因为解码器工作正常,如果我通过播放器(如vlc)播放录制的视频,它似乎也加速了,所以问题出现在编码器中。 – amrouch 2011-05-03 12:02:45

-1

当您创建的ffmpeg的文件,你必须指定的帧速率 取决于您所使用的库,但寻找像

pCodecContext->time_base.den = frames_per_second; 
pCodecContext->time_base.num = 1; 

否则如果要生成从摄像头10-15fps但该文件默认为30fps它会播放快。

了Qt的ffmpeg的包装

+0

感谢您的重播,我目前正在使用Qt ffmpeg包装器中的一些函数,就像在编码,解码中一样,而且我刚刚更改了** pCodecContext-> time_base.den **的值,即使我重复1!但仍然是相同的问题 – amrouch 2011-05-03 09:16:20

+0

我怎么知道从我的摄像头产生多少fps? – amrouch 2011-05-04 13:29:14

+0

将它设置在您的摄像头设置中,从之前的运行中进行测量。或者,如果你真的很挑剔地全速运行网络摄像头,但要丢弃图像来减少它,每“n”毫秒就只剩下一个新的帧。最好的选择只是猜测它是10-15 - directshow amcap示例或摄像头查看器应用程序会显示给您 – 2011-05-04 15:16:13