递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 3771|回复: 5
打印 上一主题 下一主题

[安卓] 有没类似的播放器( Android下H264解码 )

[复制链接]

17

主题

80

帖子

594

积分

高级会员

Rank: 4

积分
594
跳转到指定楼层
楼主
发表于 2023-1-26 18:01:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
「音视频直播技术」Android下H264解码发布于2020-04-02 10:23:02阅读 1.1K0





前言
上一篇文章中我介绍了如何使用MediaCodec编码,今天我们再来分析一下如何通过 MediaCodec 进行解码。
为了讲解的方便,我们引入了 MediaExtractor 类。它用于打开MP4等媒体文件,并从中抽取出音视频数据。
打开媒体文件
MediaExtractor,音视频数据分离器。每种媒体文件如MP4, FLV, MOOV等都是一种容器,里边存放了音频数据和视频数据。MediaExtractor的作用就是根据容器协议打开容器,并读取其中的音频或视频数据。
在容器文件(MP4)中,音频数据与视频数据是以轨道(�track)的概念存放的。取的是两条轨道永远不相交的意思,也就指明音频数据与视频数据是分别存储的。
我们使用MediaExtractor类打开媒体文件,它的使用非常简单,步骤如下:
1. 创建一个MediaExtractor对象。 2. 将媒体文件设置给MediaExtractor对象。 3. 选定要处理的轨道。
我们先来看一下示例代码吧
......MediaExtractor extractor = null;try {    extractor = new MediaExtractor();    extractor.setDataSource(sourceFile.toString());    int trackIndex = selectTrack(extractor); //根据关键字获取视频Track    if (trackIndex < 0) {        throw new RuntimeException("No video track found in " + mSourceFile);    }    extractor.selectTrack(trackIndex); //选定视频轨    ......} finally {    if (extractor != null) {        extractor.release();    }}......复制
通过上面的步骤我们就选好了要处理的视频轨。下面我们来创建解码器。
创建解码器
在创建解码器之前,需要先通过 MediaExtractor 获取到要处理的视频轨的媒体格式(因为媒体格式中包括了 CSD-0/CSD-1 信息,这个信息对于解码非常重要)。然后通过媒体格式的 mime 信息创建解码器。
CSD-0/CSD-1 指的就是 H264中的 PPS 和 SPS。
另外,在配置解码器时,可以给它传入一个 Surface,这样解码器解码后,就可以直接将图像帧渲染到 Surface里了。代码如下:
......MediaFormat format = extractor.getTrackFormat(trackIndex);// Create a MediaCodec decoder, and configure it with the MediaFormat from the// extractor.  It's very important to use the format from the extractor because// it contains a copy of the CSD-0/CSD-1 codec-specific data chunks.String mime = format.getString(MediaFormat.KEY_MIME);decoder = MediaCodec.createDecoderByType(mime);decoder.configure(format, mOutputSurface, null, 0);decoder.start();......复制
解码
解码按如下步骤进行:
1. 从InputBuffer队列中取出一个空闲的InputBuffer。 2. 通过 MediaExtractor 对象从视频轨道中取出H264数据存到InputBuffer中。 3. 将InputBuffer放到InputBuffer队列中。此时需要解码的数据已经送入了解码器。 4. 从OutputBuffer队列中取OutputBuffer,如果能取到说明已经有解码好的数据了。 5. 最后调用releaseOutputBuffer释放OutputBuffer。此时OutputBuffer中的数据将被转成纹理进行渲染。
示例代码如下:
......while (!outputDone){               ......    // Feed more data to the decoder.    if (!inputDone) {        int inputBufIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC);        if (inputBufIndex >= 0) {                      ByteBuffer inputBuf = decoderInputBuffers[inputBufIndex];            int chunkSize = extractor.readSampleData(inputBuf, 0);                        ......                          long presentationTimeUs = extractor.getSampleTime();            decoder.queueInputBuffer(inputBufIndex, 0, chunkSize,                    presentationTimeUs, 0 /*flags*/);              extractor.advance(); //处理下一帧                        ......                   }     }    if (!outputDone) {        int decoderStatus = decoder.dequeueOutputBuffer(                        mBufferInfo, TIMEOUT_USEC);                ......                if(decoderStatus > 0) {            // As soon as we call releaseOutputBuffer, the buffer will be forwarded            // to SurfaceTexture to convert to a texture.             decoder.releaseOutputBuffer(decoderStatus, doRender); //解码数据        }        ......    }}......复制
小结
通过上面的介绍我们知道通过MediaCodec进行解码也非常的简单,主要是三大步:
  • 创建视频解码器。
  • 获取数据。今天我们是通过 MediaExtrator从文件中获取的。如果是直播系统,则是直接从网上获取数据。
  • 在循环中不停的向解码器喂数据,并从解码器中取出解码后的数据。




回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40595
沙发
发表于 2023-1-27 10:24:44 | 只看该作者
本帖最后由 创世魂 于 2023-1-28 08:46 编辑

安卓里面都没封这些库。。因为用的人相对比较少吧。
这些相对也比较专业的库,搞起来也比较困难。所以都暂时没弄
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

0

主题

151

帖子

1704

积分

金牌会员

Rank: 6Rank: 6

积分
1704
板凳
发表于 2023-1-29 08:38:20 | 只看该作者
搞点视频直播库还是非常有意义的
回复

使用道具 举报

0

主题

151

帖子

1704

积分

金牌会员

Rank: 6Rank: 6

积分
1704
地板
发表于 2023-1-29 08:44:00 | 只看该作者
视频直播库可以让火山更上一层楼,现在很多软件都带这功能。
回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40595
5#
发表于 2023-1-29 08:57:11 | 只看该作者
lhy201233 发表于 2023-1-29 08:44
视频直播库可以让火山更上一层楼,现在很多软件都带这功能。

最好得有配套的服务器。

这方面知识都还是比较复杂的。。涉及到音视频处理啥的。。
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

444

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
40595
6#
发表于 2023-1-29 09:00:38 | 只看该作者
lhy201233 发表于 2023-1-29 08:44
视频直播库可以让火山更上一层楼,现在很多软件都带这功能。

当然如果不考虑服务器,直接对接大厂的那就简单多了……TX云就有提供直播sdk。很容易就可以对接上。。都是封好的直接调用就行。
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-28 07:18 , Processed in 0.090077 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表