按照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 上的电影播放器声称一个错误:无法确定流的类型。我也在VCL上试过。它根本不起作用,没有任何错误信息。
我的第二个问题是:对于从输入视频文件中提取的每个帧,我根据filtering_video.c得到它的pts如下:
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
其中 frame 是从输入视频中提取的帧,pFrameRGB_count 是 RGB24 格式的已处理帧的计数。
为什么他们错了?