按照ffmpeg的示例:decode_encoding.c和filtering_video.c,我处理了iPhone拍摄的一个视频文件。视频文件:.mov,视频尺寸; 480x272,视频编解码器:H.264/AVC,每秒30帧,比特率:605 kbps。

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

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

我的第二个问题是:
对于从输入视频文件中提取的每个fram,我根据filtering_video.c得到其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

其中frame是从输入视频中提取的帧,而pFrameRGB_count是RGB24形式的已处理帧的计数。

他们为什么错了?

最佳答案

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

值20表示以下一项或两项:

  • 对于给定的30 fps帧速率,您的编码时钟(即采样率)配置不正确(至600 Hz)
  • 您的每秒帧配置不正确(至4500fps)。

  • 计算PTS增量的一般公式为:
    PTS delta = (1/fps) * Encoder sampling rate
    

    08-29 00:10