按照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表示以下一项或两项:
计算PTS增量的一般公式为:
PTS delta = (1/fps) * Encoder sampling rate