一、概述
FFmpeg
的硬解和软解的流程大部分是一致的,关键点在于开启硬解模式,以及解码成功后从 GPU
中将数据提取出来。
二、解码过程
1、测试视频文件
为了尽可能简单,使用《FFmpeg 与 VideoToolBox(1):准备工作》准备的 temp.data
文件,其有如下特点:
(1) 非标准的;
(2) 有封装格式又足够简单的,每一帧数据有个长度头(4字节);
(3) 知道文件包含的是 H.264 数据;
(4) SPS
、PPS
数据已经在 IDR
帧中。
2、解码过程描述
解码过程对应的 FFmpeg API,可以用伪代码表示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| fopen() avcodec_find_decoder(AV_CODEC_ID_H264) avcodec_alloc_context3()
enum AVHWDeviceType type = AV_HWDEVICE_TYPE_VIDEOTOOLBOX av_hwdevice_ctx_create() AVCodecContext->hw_device_ctx = av_buffer_ref() AVCodecContext->get_format = get_hw_format
while(true) { fread() fread() avcodec_send_packet() while(true) { avcodec_receive_frame() av_hwframe_transfer_data() } }
avcodec_send_packet() while(true) { avcodec_receive_frame() av_hwframe_transfer_data() }
|
参考资料