(转) 解密H264、AAC硬件解码的关键扩展数据处理
2016-03-16 20:12
337 查看
出自:http://blog.itpub.net/30168498/viewspace-1576794/
通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这些数据是不能被正确解码的。为什么呢?因为在解码这些数据之前,需要对解码器做一些配置,典型的就是目前流行的高清编码“黄金搭档”组合H264 + AAC的搭配。本文将讲述H264和AAC的关键解码配置参数的解析,如果没有这些配置信息,数据帧往往不完整,导致了解码器不能解码。
H264的配置信息解析
前面我们知道,ffmpeg的avformat_find_stream_info函数可以取得音视频媒体多种,比如播放持续时间、音视频压缩格式、音轨信息、字幕信息、帧率、采样率等。在信息结果中有一项扩展数据描述(avcodec.h文件中):
AVCodecContext定义如下:
View Code
这个头部是固定的7字节长度,所以可提前空出这7个字节供ADTS占用。
通过以上对H264和AAC的扩展数据处理,播放各种“黄金搭档”的多媒体文件、流媒体、视频点播等都应该没有问题了。
==================================
经过验证,上述方法结合ffmpeg是可以完成解码aac的。
通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这些数据是不能被正确解码的。为什么呢?因为在解码这些数据之前,需要对解码器做一些配置,典型的就是目前流行的高清编码“黄金搭档”组合H264 + AAC的搭配。本文将讲述H264和AAC的关键解码配置参数的解析,如果没有这些配置信息,数据帧往往不完整,导致了解码器不能解码。
H264的配置信息解析
前面我们知道,ffmpeg的avformat_find_stream_info函数可以取得音视频媒体多种,比如播放持续时间、音视频压缩格式、音轨信息、字幕信息、帧率、采样率等。在信息结果中有一项扩展数据描述(avcodec.h文件中):
AVCodecContext定义如下:
int aac_set_adts_head(ADTSContext *acfg, unsigned char *buf, int size) { unsigned char byte; if (size < ADTS_HEADER_SIZE) { return -1; } buf[0] = 0xff; buf[1] = 0xf1; byte = 0; byte |= (acfg->objecttype & 0x03) << 6; byte |= (acfg->sample_rate_index & 0x0f) << 2; byte |= (acfg->channel_conf & 0x07) >> 2; buf[2] = byte; byte = 0; byte |= (acfg->channel_conf & 0x07) << 6; byte |= (ADTS_HEADER_SIZE + size) >> 11; buf[3] = byte; byte = 0; byte |= (ADTS_HEADER_SIZE + size) >> 3; buf[4] = byte; byte = 0; byte |= ((ADTS_HEADER_SIZE + size) & 0x7) << 5; byte |= (0x7ff >> 6) & 0x1f; buf[5] = byte; byte = 0; byte |= (0x7ff & 0x3f) << 2; buf[6] = byte; return 0; }
View Code
这个头部是固定的7字节长度,所以可提前空出这7个字节供ADTS占用。
通过以上对H264和AAC的扩展数据处理,播放各种“黄金搭档”的多媒体文件、流媒体、视频点播等都应该没有问题了。
==================================
经过验证,上述方法结合ffmpeg是可以完成解码aac的。
相关文章推荐
- 作业2(2)
- MySQL 加锁处理分析
- 两个数组,大小都为n,两个数组里有相同的元素,设计一个算法,找到两个数组中相同的元素
- BroadcastReceiver 广播在应用内部注册
- CA dis4 notes
- 常用的 redis操作
- 致刚毕业迷茫的我们
- Material Design (二),TextInputLayout的使用
- 函数(-)
- 今年第一次面试
- Ubuntu系统使用光盘作为apt-get源
- Android APP安装后不在桌面显示图标的应用场景
- PSP(3.13——3.15)以及周记录
- lintcode:寻找旋转排序数组中的最小值 II
- reachability ios网络连接判断
- 本地下载的软件包制作成本地repo源并使用apache发布
- 原生javascript 简易实现放大镜效果
- RPC
- 无法打开包括文件: “extensions/ExtensionExport.h”: No such file or directory
- android:finishOnTaskLaunch="true" //虽然这样设置了,但是Back键与Home键还是不同