分析使用mediarecord采集的实时流格式

分析使用mediarecord采集的实时流格式

编者:李国帅

qq:9611153 微信lgs9611153

时间:2013-7-13

背景原因:

对使用android自身的录像接口采集的实时流进行远程播放,需要写一个专门的播放程序对流进行适当处理才能进行播放。

 

差异说明:

采集mediarecord实时流传输时,和3gp或者mp4文件格式不同,因为实时流中每一帧的第一个4字节是该帧大小,而文件格式裸流的第一个4字节是标记000010BX等,所以不能混淆。

流分析:

以3gp格式

如果以3gp格式录制,编码格式如果是mp4v,

0x 00000018 66747970 69736F6D00000000 69736F6D33677034 文件头0x18字节

0x 0008737B 6D646174 文件头后面是媒体标记(mdat大小-包含大小和标记,"mdat")

 

0x 000001B6 10631996 CFACCFB6FF36DBFC 后面是mp4v帧分隔符000001B6,以及真正的视频数据,这个地方实际上是不符合mp4格式BOX标准的。

 

0x DB6FB9B6 DFE6DF7F 9F6DFE6DB7F9B6DF

在这个文件中,媒体帧的大小是从moov单元中分析出来的,所以在mdat单元中没有给出大小。

再后面就是moov单元了,放在文件最后。

 

以h264格式

如果编码格式是h264,也就是avc1,那么媒体是

00000018 667479703367703400000000 69736F6D33677034 文件头 ftyp box

00067DF5 6D646174  mdat

3C1CA8A5B89DE9C7  音频头,说明音频帧没有指明大小----------我们的测试中暂时不考虑音频

00000480 65B8407FFFF0BC50001070F7 视频帧前面的00000480指的是不包含长度的视频帧的数据大小。

补充说明:

从网络获取流的时候,可能3gp或者mp4的moov单元丢失或者没有传递,仅仅传递了数据,这时候如何播放呢?

如果只能使用流形式进行播放,需要设置好解码配置,输入关键帧,然后一帧帧的传递媒体数据到解码器进行解码播放。

传递到解码的数据必须是annexb格式而不能是rtp格式或者3gp这种必须配合索引才能解码的格式。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MediaRecorder 是 Android 提供的一个录制音视频的类,可以用来录制视频、音频、音视频等多种格式的文件。 下面是一个简单的示例代码,演示了如何使用 MediaRecorder 进行屏幕录制: ```java public class ScreenRecorder { private MediaRecorder mediaRecorder; public void startRecording() { mediaRecorder = new MediaRecorder(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.setVideoEncodingBitRate(512 * 1000); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setVideoSize(720, 1280); mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/screen_record.mp4"); try { mediaRecorder.prepare(); } catch (IOException e) { e.printStackTrace(); } mediaRecorder.start(); } public void stopRecording() { mediaRecorder.stop(); mediaRecorder.release(); } } ``` 此示例中,我们使用了 `MediaRecorder.VideoSource.SURFACE` 作为录制视频的源,并设置了输出格式、视频编码器、视频编码比特率、视频帧率、视频大小和输出文件路径等参数。然后,调用 `prepare()` 方法进行准备,最后调用 `start()` 方法开始录制视频。 当需要停止录制时,调用 `stop()` 方法停止录制,并释放资源。 需要注意的是,录制屏幕需要申请权限,并且在 Android 5.0 以上版本需要使用 MediaProjection API。具体实现可以参考 Android 官方文档或其他相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值