mp4v android,Android 的视频编码 H263 MP4V H264 - 代码人生 - 优快云博客

本文探讨了如何在Android上使用MediaRecorder进行H263、MP4V和H264的实时编码,重点关注服务器端解析视频流,包括mdat标志定位和不同编码格式的处理策略。作者分享了关键步骤和参考链接,旨在实现高效的视频分帧处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

9632821_1.gif 

Android 的视频编码 H263 MP4V H264

上一篇我说了如何使用JNI进行h264编码,但是由于效率的问题 感觉并不太实用。

经过几天的折腾,并参照http://www.javaeye.com/problems/27244

大体实现的Android 的实时编码问题,但是只是思路,还没有进入代码实现的阶段。

比较重要的2个类 MediaRecorder

ParcelFileDescriptor

MediaRecorder 是Android提供的进行采集编码的类,而

ParcelFileDescriptor是个用Socket实现

setOutputFile的一个类

在测试liuzongan

的程序的过程中,发现其他这位仁兄已经实现了我们需要的大部分的功能,唯一要处理的就是在服务器端的程序。

在这里我先猜测一下MediaRecorder写文件的过程

1 ,

MediaRecorder写入一个固定的头,估计是占位用的 都是00H(

占位的长度好像和使用的编码器有关系)

9632821_2.gif

再插入 00 00 00 08 6D 64 61 74 (mdat box)

2,开始编码,并把编码后的没一个帧都添加到文件中,看到00 00 80了没, 了解h263的同志一定很熟悉,根本就是263视频的标志吗!

(如果有音频数据的话,很定会和视频数据交错在一起,但是我们的目标只是实时编码视频流,不需要处理音频,所以在初始化

MediaRecorder的时候我不不要

MediaRecorder.setAudioSource,这样就没有音频数据了。)

3 结束捕获。

MediaRecorder应该会返回到文件的头部填充文件头。但由于不是真正文件的关系,不能返回到头部,于是就把文件头附加到文件的后面了,感觉也就是

liuzongan

这仁兄提出的问题的答案了。

9632821_3.gif

这个是,文件开头mdat box的长度,用于替换 00 00 00 08.

9632821_4.gif

这个是3gp文件的头, 用于替换开头的占位。

4最后,

MediaRecorder补充3gp文件的moov box ,这一部分已经属于3gp的媒体索引部分了,具体的内容对于我们来说已经不太关心了。大家可以参照http://www.cnitblog.com/zouzheng/archive/2007/04/04/25155.html

研究。

9632821_5.gif

9632821_6.gif

9632821_7.gif

9632821_8.gif

下开始说我们要是实现的内容了

其实有了上面的描述,大家应该能想到我们要实现的其实就是视频的分帧就可以了。。

server 端处理h263的方法

1一步 找到 mdat这个串, 后面的数据就是我们要的视频数据了,

2在流中查找 00 00 80 这个标志,每一个都是一帧数据的开始

对于 h264和mpeg4的,要预采集一次数据,这是因为mp4v的相关解码参数,在esds box中的, 而esds box

是在采集结束后才写入的,所以对于我们的程序来说需要先编码一次 获取 mp4v的相关解码参数,然后在用相同的参数进行采集, 呵呵

这样我们就能获得原始的mp4v流了

9632821_9.gif

h264一样  不过是存在了 avcC box 里

9632821_10.gif

9632821_11.gif

9632821_12.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值