基于Android设备的HLS流硬解码方法及装置的制造方法

文档序号:10539475阅读:376来源:国知局
基于Android设备的HLS流硬解码方法及装置的制造方法
【专利摘要】本发明实施例提供一种基于Android设备的HLS流硬解码方法及装置。使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码;在配置模式下,将所述硬解码信息写入MediaCodec;使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码;同步解码完成的所述音频包和所述视频包,并进行播放。与软解码相比,极大降低了解码过程中的CPU占有率,降低了功耗。
【专利说明】
基于Andro id设备的HLS流硬解码方法及装置
技术领域
[0001]本发明实施例涉及视频解码技术领域,尤其涉及一种基于Android设备的HLS流硬解码方法及装置。
【背景技术】
[0002]HLS JPHTTP Live Streamin,是美国苹果公司开发的一种优秀的动态码率自适应协议,HLS协议将容量巨大的连续媒体数据进行分段,分割为数量众多的小文件进行传递,迎合了网页服务器的文件传输性,采用一个不断更新的轻量级索引文件来控制分割后小媒体文件的下载和播放,可以实现流媒体的直播和点播,并且具有良好的扩展性。Apple 1S对此协议是天然支持的,而另一个重要的移动操作系统Android对HLS的支持却很有限,开发者不能使用Andrο i d SDK开发出能很好支持HLS协议的播放器。
[0003]针对Android解析解码HLS协议的问题,现有技术中有的播放器采用了 NDK(NativeDevelopment Kit,即原生开发工具包)来实现解析解码HLS协议,在NDK的动态库中使用FFmpeg(Fast Forward Mpeg,即快速的Mpeg,Mpeg是一种压缩比率较大的活动图象和声音的压缩标准)实现软解码,该方案能够很好的解析解码HLS协议,实现Android端播放HLS流媒体,实现也相对简单。但是却有一定的弊端,即由于是软解码,CPU占用率高,功耗大,耗电快,在移动端对用户来说是一种不好的体验。
[0004]因此,针对上述缺陷,一种新的解码方案亟待提出。

【发明内容】

[0005]本发明实施例提供一种基于Android设备的HLS流硬解码方法及装置,用以解决现有技术中在Android系统的设备上解析解码HLS协议时,CPU占用率高,功耗大的缺陷,实现了基于Android设备的HLS流低功耗、高效率硬解码。
[0006 ]本发明实施例提供一种基于Andro id设备的HLS流硬解码方法,包括:
[0007]使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码;
[0008]在配置模式下,将所述硬解码信息写入MediaCodec;
[0009]使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码;
[0010]同步解码完成的所述音频包和所述视频包,并进行播放。
[0011]本发明实施例提供一种基于Android设备的HLS流硬解码装置,包括:
[0012]硬解码信息获取模块,用于使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码;
[0013]解码器配置模块,用于在配置模式下,将所述硬解码信息写入MediaCodec;
[0014]解码模块,用于使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码;
[0015]同步模块,用于同步解码完成的所述音频包和所述视频包,并进行播放。
[0016]本发明实施例提供的基于Android设备的HLS流硬解码方法及装置,通过结合FFmpeg解析HLS协议和使用Android SDK Media Codec类实现硬解码,改变了现有技术中Android设备采用软解码时CPU占用率高,功耗大且耗电快的缺陷,实现了良好的用户体验。
【附图说明】
[0017]为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0018]图1为本发明实施例一的技术流程图;
[0019]图2为本发明实施例二的技术流程图;
[0020]图3为本发明实施例三的技术流程图;
[0021 ]图4为本发明实施例四的装置结构示意图;
[0022]图5为本发明实施例五的技术流程图。
【具体实施方式】
[0023]为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0024]实施例一
[0025]图1是本发明实施例一的技术流程图,结合图1,本发明实施例一种基于Android设备的HLS流硬解码方法包括如下步骤:
[0026]步骤110:使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码;
[0027]HLS,g最初是苹果公司针对其iPhone、iPod、iTouch和iPad等移动设备而开发的流媒体协议。HTTP Live Streaming允许内容提供者通过普通Web服务器向上述客户端提供接近实时的音视频流媒体服务,包括直播和点播。HTTP Live Streaming支持将同一节目编码为不同码率的多个替换流,客户端软件可以根据网络带宽的变化在这些不同码率的替换流之间进行智能切换。此外,HTTP Live Streaming还支持通过媒体加密和用户认证等方式来达到媒体版权保护。
[0028]HLS协议中有一个m3u8索引文件,里面是一些TS(Transport Stream,即传送流分析器)包的URL13TS是一种封装格式,音频数据和视频数据以及辅助信息都会被封装成为188字节的TS包。一个TS包是由TS头和PES(Packetized Elementary Streams,即打包的基本码流)流打包而成。其中PES流是由PES头和ES (El ementary Streams,即基本码流)流打包而成,而ES流中包括音频数据和视频数据。TS包中封装的视频编码格式是H264的,因此,对于视频,我们需要解码H264。解码H264需要向解码器传递一些解码信息配置解码器才能实现解码。
[0029]所述硬件解码信息进一步包括SPS(Software Product Specificat1n)信息和PPS(Picture Parameter Set)信息,其中,所述SPS信息指数列的参数集信息,所述PPS信息指图像的参数集信息。
[0030]在FFmpeg中打开所述HLS流的URL后,读取第一个视频包并判断所述第一个视频包是否为H264格式的视频包;
[0031 ]若判定为是,则利用所述解码器对所述第一个视频包进行解码并获取包含所述SPS信息的数据帧以及所述PPS信息的数据帧。
[0032]步骤120:在配置模式下,将所述硬解码信息写入MediaCodec;
[0033]具体的,使用参数MediaCodec.BUFFER_FLAGJ:0DEC_C0NFIG将所述硬解码信息写入MediaCodec ο
[0034]步骤130:使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码;
[°035] MediaCodec是android系统提供的解码H264的硬件解码器,通常用于解码mp4,原生android MediaCodec并没有提供解码HLS的能力,由于android良好的封装,MediaCodec解码比较简单,大致过程是:初始化MediaCodec,并绑定一个用于显示的surface ;然后将FFmpeg解复用出的video packet(视频包)送给MediaCodec,MediaCodec解码后,显示在绑定的surf ace上,然后再用FFmpeg解复用出video packet (视频包)送给MediaCodec,解码,显示在surface上,如此反复。
[0036]本发明实施例中,使用FFmpeg的接口读取所述视频包并通过带有一个buffer和buffer长度的JNI((Java Native Interface,即Java本地接口))方法将所述视频包传送给所述MediaCodec进行解码,其中,buffer中传入所述视频包的内容,buffer长度就是所述视频包的长度。具体地,本实施例中使用FFmpeg的av_read_frame接口读取所述视频包。FFmpeg中的av_read_frame接口的作用是读取码流中的音频若干帧或者视频若干帧。例如,解码视频的时候,每解码一个视频帧,需要先调用av_read_frame()获得一帧视频的压缩数据,然后才能对该数据进行解码。
[0037]步骤140:同步解码完成的所述音频包和所述视频包,并进行播放。
[0038]比较所述视频包在解码过程中对应的解码时间标签是否大于所述音频包解码完成时对应的所述解码时间标签,若是,则控制所述视频包的解码速度用以实现视频与音频的同步。
[0039]需要说明的是,本发明实施例中,在解码之前预先使用FFmpeg对视频和音频解复用,解复用就是提取出音频文件和视频文件的ES流数据。
[0040]本实施例中,使用FFmpeg解析HLS流媒体文件,并使用用MediaCodec类实现硬解码,改变了现有技术中Android设备软解码HLS流媒体文件时CPU占用率高,功耗大且耗电快的缺陷,实现了良好的用户体验。
[0041 ] 实施例二
[0042]以下部分将用一个实施例进一步阐述本发明实施例如何配置解码器以实现H264解码。
[°°43] 步骤210:在FFmpeg中打开所述HLS流的URL后,使用av_read_f rame读取第一个视频包;
[0044]步骤220:判断所述第一个视频包是否为H264格式的视频包;
[0045]具体判断方法:首先需要判断是否为H264编码的视频包,H264视频数据帧以00,00,00,01或00,00,01开始;同时SPS开始的第一个字节是0x67,PPS的第一个字节是0x68。因此对于以(^00,(^00,(^00,(^01,(^67或(^00,(^00,(^01,(^67开始的数据帧就是包含5?3信息的数据帧;对于以0x00,0x00,0x00,0x01,0x68或0x00,0x00,0x01,0x68开始的数据帧就是包含PPS信息的数据帧。这里我们不需要对SPS和PPS做详细的分析,只需要获取到它们,并将它们传递给MediaCodec。
[0046]步骤230:当判定所述第一个视频包为H264格式的视频包时,获取包含所述SPS信息的数据帧以及所述PPS信息的数据帧,并将所述SPS信息和所述PPS信息传递至MediaCodec;
[0047]步骤240:在配置模式下,将所述SPS信息和所述PPS信息写入MediaCodec。
[0048]即使用参数MediaCodec.BUFFER_FLAG_CODEC_CONFIG):
[0049]mMediaCodec.queueInputBuffer(inputBufIndex,0,samp IeSize,I,MediaCodec.BUFFER_FLAG_C0DEC_C0NFIG);
[0050]本实施例中,获取SPS信息和PPS信息,并将其写入MediaCodec用于硬解码H264格式的视频包,极大减小了解码时CR]的占用率,降低了设备的功耗。
[0051 ] 实施例三
[0052]以下部分将进一步阐述本发明实施例中,对于一个同时包含音频和视频的HLS媒体流在播放时音频和视频同步的实现过程。
[0053]步骤310:使用FFmpeg将HLS流解复用为音频包和视频包;
[0054]步骤320:使用FFmpeg对所述音频包进行解码,并使用MediaCodec对所述视频包进行解码;
[0055]步骤330:检测所述待播放的音频信号和待播放的视频信号中携带的解码时间标签是否一致,若待播放的音频信号和待播放的视频信号中携带的解码时间标签不一致时,发送同步请求;
[0056]由于所述视频包采用硬解码,速度较快,因此,本步骤中,以所述音频信号携带的所述解码时间标签为基础,对比所述视频信号携带的解码时间标签,计算二者的解码时间标签之间的差值。
[0057]步骤340:接收所述同步请求,调用release Output Buffer显示视频画面,并根据所述差值控制所述视频包解码的速度;
[0058]本步骤中,通过给解码器绑定一个surface,解码器就能直接显示画面,且可以控制解码的速度。
[0059]步骤350:输出同步之后的所述待播放音频信号和所述待播放视频信号。
[0060]本发明实施例一种示例性的实施方式中,有两种同步调整音频数据和视频数据的解码时间标签的方式。一种是根据音频数据的解码时间标签修正视频数据的解码时间标签,也就是以音频数据的解码时间标签为基准,修正视频数据的解码时间标签,使之和音频数据的解码时间标签一致。一种是在音视频数据的解码时间标签和音频、视频数据的解码时间标签差别较大时,根据音视频数据的解码时间标签修正音频数据和视频数据的解码时间标签。将音频数据和视频数据的解码时间标签都修正为所述音视频数据的解码时间标签,以确保音频数据和视频数据的解码时间标签相对准确。
[0061]本实施例中,在解码之后播放之前,检测待播放的音频信号和待播放的视频信号中携带的解码时间标签是否一致,进而检测待播放的音频信号和待播放的视频信号的输出是否同步,并通过控制视频数据的解码速度保证了音视频的同步,解码快且播放质量高,进一步提升了用户体验。
[0062]实施例四
[0063]图4是本发明实施例四的装置结构示意图,本发明实施例一种基于Android设备的HLS流硬解码装置主要包括以下几个大的模块:硬解码信息获取模块410、解码器配置模块420、解码模块430、同步模块440。
[0064]所述硬解码信息获取模块410,用于使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码;
[0065]所述解码器配置模块420,用于在配置模式下,将所述硬解码信息写入MediaCodec;
[0066]所述解码模块430,用于使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码;
[0067]所述同步模块440,用于同步解码完成的所述音频包和所述视频包,并进行播放。
[0068]具体地,所述硬件解码信息进一步包括SPS信息和PPS信息,其中,所述SPS信息指数列的参数集信息,所述PPS信息指图像的参数集信息。
[0069]进一步地,所述硬解码信息获取模块410用于在FFmpeg中打开所述HLS流的URL后,读取第一个视频包并判断所述第一个视频包是否为H264格式的视频包;若判定为是,则利用所述解码器对所述第一个视频包进行解码并获取包含所述SPS信息的数据帧以及所述PPS信息的数据帧。
[0070]进一步地,所述解码模块430进一步用于:使用FFmpeg的接口读取所述视频包并通过JNI传送给所述MediaCodec进行解码。
[0071]进一步地,所述同步模块440进一步用于:比较所述视频包在解码过程中对应的解码时间标签是否大于所述音频包解码完成时对应的所述解码时间标签,若是,则控制所述视频包的解码速度用以实现视频与音频的同步。
[0072]本实施例中,使用FFmpeg解析HLS流媒体文件,并使用用MediaCodec类实现硬解码,改变了现有技术中Android设备软解码HLS流媒体文件时CPU占用率高,功耗大且耗电快的缺陷,实现了良好的用户体验。
[0073]实施例五
[0074]以下部分将通过一个更加详细的实施例来描述本发明实施例一种基于Android设备的HLS流硬解码装置中的硬解码信息获取模块、解码器配置模块、解码模块以及同步模块的工作过程。
[0075]步骤510:所述硬解码信息获取模块使用FFmpeg对视频和音频解复用,提取出音频文件和视频文件的ES流数据;
[0076]步骤520:所述硬解码信息获取模块在FFmpeg中打开所述HLS流的URL后,读取第一个视频包并判断所述第一个视频包是否为H264格式的视频包;若判定为是,则利用所述解码器对所述第一个视频包进行解码并获取包含所述SPS信息的数据帧以及所述PPS信息的数据帧;
[0077]具体地,所述硬件解码信息进一步包括SPS信息和PPS信息,其中,所述SPS信息指数列的参数集信息,所述PPS信息指图像的参数集信息。
[0078]具体判断方法:首先需要判断是否为H264编码的视频包,H264视频数据帧以00,00,00,01或00,00,01开始;同时SPS开始的第一个字节是0x67,PPS的第一个字节是0x68。因此对于以(^00,(^00,(^00,(^01,(^67或(^00,(^00,(^01,(^67开始的数据帧就是包含5?3信息的数据帧;对于以0x00,0x00,0x00,0x01,0x68或0x00,0x00,0x01,0x68开始的数据帧就是包含PPS信息的数据帧。
[0079]步骤530:所述硬解码信息获取模块将包含所述SPS信息的数据帧以及所述PPS信息的数据帧传送至MediaCodec ;
[0080]步骤540:所述解码器配置模块在配置模式下,将所述硬解码信息写入MediaCodec;
[0081 ]具体地,使用参数MediaCodec.BUFFER_FLAG_CODEC_CONFIG):
[0082]mMediaCodec.queueInputBuffer(inputBufIndex,0,samp IeSize,I,MediaCodec.BUFFER_FLAG_C0DEC_C0NFIG);
[0083]步骤550:所述解码模块,使用FFmpeg的接口读取所述视频包并通过JNI传送给所述MediaCodec进行解码;
[0084]本实施例中使用FFmpeg的av_read_frame接口读取所述视频包。
[0085]步骤560:所述解码模块,使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码;
[0086]步骤570:所述同步模块,同步解码完成的所述音频包和所述视频包,并进行播放。
[0087]比较所述视频包在解码过程中对应的解码时间标签是否大于所述音频包解码完成时对应的所述解码时间标签,若是,则控制所述视频包的解码速度用以实现视频与音频的同步。
[0088]以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0089]通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如R0M/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
[0090]最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
【主权项】
1.一种基于Android设备的HLS流硬解码方法,其特征在于,包括如下步骤: 使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码; 在配置模式下,将所述硬解码信息写入MediaCodec; 使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码; 同步解码完成的所述音频包和所述视频包,并进行播放。2.根据权利要求1所述的方法,其特征在于,所述硬件解码信息具体包括SPS信息和PPS信息,其中,所述SPS信息指数列的参数集信息,所述PPS信息指图像的参数集信息。3.根据权利要求1或2所述的方法,其特征在于,获取硬解码信息,具体包括: 在FFmpeg中打开所述HLS流的URL后,读取第一个视频包并判断所述第一个视频包是否为H264格式的视频包; 若判定为是,则利用所述解码器对所述第一个视频包进行解码并获取包含所述SPS信息的数据帧以及所述PPS信息的数据帧。4.根据权利要求1所述的方法,其特征在于,利用所述MediaCodec对所述视频包进行解码,具体包括: 使用FFmpeg的接口读取所述视频包并通过JNI传送给所述MediaCodec进行解码。5.根据权利要求1所述的方法,其特征在于,同步解码完成的所述音频包和所述视频包,并进行播放,具体包括: 比较所述视频包在解码过程中对应的解码时间标签是否大于所述音频包解码完成时对应的所述解码时间标签,若是,则控制所述视频包的解码速度用以实现视频与音频的同步。6.—种基于Android设备的HLS流硬解码装置,其特征在于,包括如下的模块: 硬解码信息获取模块,用于使用FFmpeg对HLS流进行解析,获取硬解码信息,所述硬解码信息用于配置解码器以解码视频编码; 解码器配置模块,用于在配置模式下,将所述硬解码信息写入MediaCodec; 解码模块,用于使用FFmpeg解码所述HLS流的音频包并读取所述HLS流的视频包,利用所述MediaCodec对所述视频包进行解码; 同步模块,用于同步解码完成的所述音频包和所述视频包,并进行播放。7.根据权利要求6所述的装置,其特征在于,所述硬件解码信息具体包括SPS信息和PPS信息,其中,所述SPS信息指数列的参数集信息,所述PPS信息指图像的参数集信息。8.根据权利要求6或7所述的装置,其特征在于,所述硬解码信息获取模块进一步用于: 在FFmpeg中打开所述HLS流的URL后,读取第一个视频包并判断所述第一个视频包是否为H264格式的视频包; 若判定为是,则利用所述解码器对所述第一个视频包进行解码并获取包含所述SPS信息的数据帧以及所述PPS信息的数据帧。9.根据权利要求6所述的装置,其特征在于,所述解码模块进一步用于:使用FFmpeg的接口读取所述视频包并通过JNI传送给所述MediaCodec进行解码。10.根据权利要求6所述的装置,其特征在于,所述同步模块进一步用于:比较所述视频包在解码过程中对应的解码时间标签是否大于所述音频包解码完成时对应的所述解码时间标签,若是,则控制所述视频包的解码速度用以实现视频与音频的同步。
【文档编号】H04N21/43GK105898496SQ201510797426
【公开日】2016年8月24日
【申请日】2015年11月18日
【发明人】李先彪
【申请人】乐视网信息技术(北京)股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1