`
damengjiejie
  • 浏览: 9908 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

解密多媒体硬件解码关键技术

 
阅读更多

通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这些数据是不能被正确解码的。为什么呢?因为在解码这些数据之前,需要对解码器做一些配置,典型的就是目前流行的高清编码“黄金搭档”组合H264 + AAC的搭配。本文将讲述H264和AAC的关键解码配置参数的解析,如果没有这些配置信息,数据帧往往不完整,导致了解码器不能解码。

  • H264的配置信息解析

    前面我们知道,ffmpeg的avformat_find_stream_info函数可以取得音视频媒体多种,比如播放持续时间、音视频压缩格式、音轨信息、字幕信息、帧率、采样率等。在信息结果中有一项扩展数据描述(avcodec.h文件中):

          AVCodecContext定义如下:

    如果视频流是H264,这个extradate里面就包含了H264的配置信息,这个扩展数据有如下定义:

    详细解释可以参考“ISO-14496-15 AVC file format”文档。里面最重要的就是NAL长度和SPS,PPS数据和对应的长度信息。对该数据的解析在ffmpeg里面有现成的函数:ff_h264_decode_extradata,在我的项目里面是自己写的扩展数据解析。

  • AAC的配置信息解析及设置

    如果音频数据是AAC流,在解码时需要ADTS(Audio Data Transport Stream)头部,不管是容器封装还是流媒体,没有这个,一般都是不能播放的。很多朋友在做AAC流播放时遇到播不出声音,很可能就是这个原因导致。

    ADTS所需的数据仍然是放在上面的扩展数据extradata中,我们需要先解码这个扩展数据,然后再从解码后的数据信息里面重新封装成ADTS头信息,加到每一帧AAC数据之前再送解码器,这样就可以正常解码了。

    extradate数据定义如下:

     

        详细信息及说明请参考“ISO-IEC-14496-3 (Audio)”的AudioSpecificConfig部分。里面最重要的部分有采样频率、通道配置和音频对象类型,这几个一般都是AAC解码器需要的配置参数。

        这个数据在ffmpeg中也有相应的解码函数:avpriv_aac_parse_header。在我的项目中,我没有使用这个函数,而是自己实现的:

  • 1
    2
    3
    4
    5
    6
    7
    typedef struct
    {
          int write_adts;
          int objecttype;
          int sample_rate_index;
          int channel_conf;
    }ADTSContext;

      

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    int aac_decode_extradata(ADTSContext *adts, unsigned char *pbuf, int bufsize)
    {
          int aot, aotext, samfreindex;
          int i, channelconfig;
          unsigned char *p = pbuf;
        
          if (!adts || !pbuf || bufsize<2)
          {
                return -1;
          }
          aot = (p[0]>>3)&0x1f;
          if (aot == 31)
          {
                aotext = (p[0]<<3 | (p[1]>>5)) & 0x3f;
                aot = 32 + aotext;
                samfreindex = (p[1]>>1) & 0x0f;
                  
                if (samfreindex == 0x0f)
                {
                      channelconfig = ((p[4]<<3) | (p[5]>>5)) & 0x0f;
                }
                else
                {
                      channelconfig = ((p[1]<<3)|(p[2]>>5)) & 0x0f;
                }
          }
          else
          {
                samfreindex = ((p[0]<<1)|p[1]>>7) & 0x0f;
                if (samfreindex == 0x0f)
                {
                      channelconfig = (p[4]>>3) & 0x0f;
                }
                else
                {
                      channelconfig = (p[1]>>3) & 0x0f;
                }
          }
        
    #ifdef AOT_PROFILE_CTRL
          if (aot < 2) aot = 2;
    #endif
          adts->objecttype = aot-1;
          adts->sample_rate_index = samfreindex;
          adts->channel_conf = channelconfig;
          adts->write_adts = 1;
        
          return 0;
    }

      

          上面的pbuf就是extradata。

        接下来,再用ADTSContext数据编码为ADTS头信息插入每一个AAC帧前面:

  • 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
    32
    33
    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;
    }

      

    这个头部是固定的7字节长度,所以可提前空出这7个字节供ADTS占用。

      通过以上对H264和AAC的扩展数据处理,播放各种“黄金搭档”的多媒体文件、流媒体、视频点播等都应该没有问题了。

      想第一时间获得更多原创文章,请关注个人微信公众平台:程序员互动联盟(coder_online),扫一扫下方二维码或者搜索微信号coder_online即可关注,里面有大量Android,Chromium,Linux等相关文章等着您,我们还可以在线交流。

                                                                             

    摘自:http://my.oschina.net/u/2336532/blog/400790

分享到:
评论

相关推荐

    jpg软件解码STM32平台_STM32jpg_stm32jpeg软解码_STM32JPEG解码_STM32JPG解码_jpg软

    在嵌入式系统领域,STM32是一款广泛应用的微控制器,尤其在图像处理和多媒体应用中。本主题主要关注如何在STM32平台上实现JPG软件解码,以高效地显示和处理JPEG图像。STM32平台上的JPEG解码不仅需要理解和掌握STM32...

    C#Krc歌词解码源码

    C#Krc歌词解码源码通常会包含以下几个关键部分: 1. **数据解析**:解析Krc文件的二进制数据,包括读取头部信息、获取歌词条目的数量以及解密每个条目的时间戳和文本。 2. **加密算法**:Krc歌词的解码涉及到特定...

    音频解码实现C++音频解码实现C++

    本文将深入探讨如何使用C++语言来实现音频解码的过程,以及相关的技术细节和挑战。 首先,我们要理解音频解码的基本概念。音频编码是将原始的模拟音频信号转化为数字格式的过程,而解码则是这个过程的逆向操作,即...

    解析数字电视机顶盒的关键技术

    数字电视机顶盒的关键技术涉及多个层面,包括复用和解压缩技术、下行数据解调与信道解码技术、上行数据的调制编码、网络浏览技术、实时操作系统和中间件技术。 1.复用和解压缩技术:数字化模拟信号后,信息量剧增,...

    视频加密转码、解密播放技术方案

    视频加密转码、解密播放技术方案是一种综合性的多媒体处理技术,涉及到多个关键环节,包括视频的检测、传输、下载、编解码、加密、存储、播放以及与之相关的工具和协议。以下是对这些关键知识点的详细说明: 1. **...

    DE2_video_decode.rar_de2-70_de2解密

    在本项目中,“DE2_video_decode.rar_de2-70_de2解密”是一个与Altera DE2开发板相关的视频解码实现,采用Verilog HDL(硬件描述语言)进行设计。Altera DE2是一款广泛使用的教育级FPGA(Field-Programmable Gate ...

    数字电视机顶盒关键技术.docx

    其涵盖的关键技术包括信道解码技术、调制编码技术、嵌入式 CPU 技术、加解扰技术、中间件技术和实时操作系统等。 信道解码技术是数字电视机项盒中的信道解码过程相当于模拟电视机中的高频头和中频放大器的作用。...

    行业分类-设备装置-多媒体文件的播放方法及系统.zip

    综上所述,多媒体文件的播放方法及系统是一个涵盖广泛的技术领域,涉及文件格式、编解码、硬件优化、流媒体、系统集成等多个方面。随着技术的发展,这一领域的创新将继续改善用户的多媒体体验。

    行业分类-设备装置-多媒体信息播放方法和装置.zip

    《多媒体信息播放方法和装置》这一主题涉及到信息技术领域中的多媒体处理和播放技术,这是一项广泛应用于数字媒体、娱乐、教育、广告等多个领域的关键技术。在现代信息化社会,多媒体信息的高效处理与播放对于提升...

    面包网百度影音资源采集解密

    总结来说,"面包网百度影音资源采集解密"涉及到的关键技术有: 1. 资源采集:通过编程手段从网页中抓取数据,特别是视频播放地址。 2. 解密技术:理解并应用加密算法,将加密的播放地址还原成可用的URL。 3. PHP...

    Hi3520 H.264编解码处理器用户指南

    - **体系架构**:Hi3520的体系架构包含了多个关键组成部分,旨在实现高效的视频处理和编解码。 - **处理器系统**:这是系统的核心,负责执行指令和控制整个处理器的运行,可能包含高性能的CPU核心,支持复杂的计算...

    喜马拉雅x2m文件解密工具x2m转m4a

    总之,这个主题涵盖了解析和转换特定音频格式的技术,以及如何使用不同的工具(如喜马拉雅x2m文件解密工具和格式工厂)来实现这一目标。在处理数字音频时,理解不同格式的特性、转换流程和可能的法律限制是很重要的...

    行业分类-设备装置-多媒体文件的播放控制方法及装置.zip

    DRM系统如Widevine、FairPlay和PlayReady用于加密和解密多媒体内容。 8. **网络适应性**:在网络条件不稳定的情况下,播放控制应能自动调整码率,保证播放的连续性。这涉及到缓冲区管理,以及在网络波动时的智能...

    压缩域多媒体数据处理技术探究.pdf

    “处理技术”则是指用于管理和操作这些数据的方法,包括编码、解码、加密和解密等过程。“探究”意味着我们将对这一领域的技术和实践进行深入研究。 在当前多媒体高速发展的时代,信息产业对数据传输速度和质量的...

    海思Hi3515编解码处理器用户指南

    该芯片集成了多种高级功能,包括先进的视频编解码技术、丰富的多媒体接口以及强大的图像处理能力。 **1.1.2 处理器系统** - **中央处理器**:采用高性能的RISC架构处理器,提供强大的计算能力。 - **图形处理器**...

    分布式视频编码关键技术及其发展趋势

    分布式视频编码是一种新兴的视频编码技术,旨在适应现代多媒体通信中对低功耗、低复杂度编码和高效压缩的需求。这种编码方式的核心理念是利用信息论中的Slepian-Wolf和Wyner-Ziv定理,将编码过程分解为编码端和解码...

    DVD音频解码库源码-libdvdread-master.zip

    在当今数字化的世界中,音频解码库是多媒体技术的核心组成部分,它们负责将存储在各种媒体格式中的音频数据转化为人类可听的声音。DVD音频解码库,如libdvdread,是专为处理DVD音频流而设计的开源软件库,为开发者...

    行业分类-设备装置-数字解码器中应用的下载.zip

    8. **未来发展**:随着5G、AI和物联网等技术的发展,数字解码器的性能和功能将持续提升,更加智能化和自适应,满足不断增长的多媒体和通信需求。 总之,数字解码器作为现代信息技术的基石,它的应用广泛且深度影响...

    移动多媒体广播条件接收系统技术规范(CMMB)

    《移动多媒体广播条件接收系统技术规范(CMMB)》是针对移动多媒体广播服务中安全性、可靠性和用户体验的重要技术标准。这一规范详细规定了移动多媒体广播条件接收系统的各个方面,旨在确保内容的有效保护、用户访问...

    加密视频解码,ev4转mp4,下载即可用

    解码EV4视频的关键在于获取正确的解密密钥和使用支持这种格式的解码器。 解码过程通常包括以下步骤: 1. **密钥获取**:在解码加密视频之前,你需要获取用于解密的密钥。这可能通过购买、订阅或者通过认证的登录...

Global site tag (gtag.js) - Google Analytics