2013-03-17 30 views
5

继ffmpeg:decode_encoding.c和filtering_video.c之后,我会处理iPhone拍摄的一个视频文件。视频文件:.mov,视频尺寸; 480x272,视频编解码器:H.264/AVC,每秒30帧,比特率:605 kbps。为什么frame-> pts增加20,而不是1?

我首先提取每个帧,这是YUV。 我将YUV转换为RGB24,并处理RGB24,然后将RGB24写入.ppm文件。它显示.ppm文件是正确的。

然后我打算将处理过的RGB24帧编码为视频文件。 由于MPEG不支持RGB24图片格式,我使用了AV_CODEC_ID_HUFFYUV。 但输出视频文件(显示18.5 MB)不播放。 Ubuntu上的电影播放器​​声明错误:无法确定流的类型。 我也在VCL上试过。它根本不起作用,没有任何错误信息。

我的第二个问题是: 从输入的视频文件,我得到它的PTS各提取FRAM如下根据filtering_video.c:

frame->pts = av_frame_get_best_effort_timestamp(frame);

我打印出每帧的PTS,并发现它由20增加时,象下面这样:

pFrameRGB_count: 0, frame->pts: 0 
pFrameRGB_count: 1, frame->pts: 20 
pFrameRGB_count: 2, frame->pts: 40 
pFrameRGB_count: 3, frame->pts: 60 

其中帧是从输入视频提取的帧,并且pFrameRGB_count是用于RGB24形式处理的帧的计数。

他们为什么错了?

回答

5

H.264视频使用90 kHz clock来编码timestamps。由于您的视频是30 fps,因此2个连续帧之间的PTS增量应为3000而不是20

20的值指示如下内容的一个或两个:

  • 你的编码时钟(即采样率)没有正确地配置(600赫兹)为每秒30帧

  • 的给定帧速率
  • 您的每秒帧数配置不正确(至4500fps)。

的一般公式来计算PTS delta是:

PTS delta = (1/fps) * Encoder sampling rate 
0

我调试以获得输入视频文件的编解码器的上下文,dec_ctx-> time_base.den = 1200; 我知道fps,30,通过右键单击输入视频文件来检查其属性(Ubuntu 12.04) 因此,看起来帧的持续时间应该是1200/30 = 40个基本单位。 但它是20通过使用frame-> pts = av_frame_get_best_effort_timestamp(frame);

输入视频的读取分组具有的持续时间= 20

我发现dec_ctx-> ticks_per_frame = 2。我想ticks_per_frame使40〜20 也许有一些内式,如:帧持续时间以基本单位=帧持续时间x ticks_per_frame(但它看起来与ffmpeg文档中所说的不同,比如time_base等于1 /帧速率。)

0

我想我找到了答案。 由于缺乏ffmpeg的详细文档,用户可能会误导。 我发现,要获得正确的点,每个人都应该使用: video_st->那么time_base 不video_st-> codec->那么time_base

(a)框架的绝对时间:

分组> DTS *(1/video_st-> time_base.den)

(b)该帧和它的下一个帧之间的绝对时间:

帧 - > repeat_pict *(1/video_st-> time_base.den)

相关问题