Android30分钟 DIY搭建局域网视频直播演示Demo

        现在移动直播如火如荼的一片大火。而直播技术也层出不穷,各种开源的,收费的直播SDK平台也不少。以上所有种种,虽然可以快速的实现直播功能,但对于自己技术的积累和学习并没有什么好处。本例子通过不借助任何框架。纯手打代码的模式。所有代码皆可编辑查看方便自己学习和积累。

       手机直播的原理很简单。就是通过手机带有的Camera模块。获取到Camera的数据,然后通过网络,发送到服务器。服务器再通过广播,推送到其他客户端。主要涉及到采集数据,发送数据,广播数据,客户端接受数据,再显示数据。如下图所示,视频直播离不开视频采集,原始的视频数据太大了,需要进行视频处理,处理后再压缩,节省宝贵的宽带,最后进行推流,推出去。


       以上,说的很简单。其实实际操作起来,有好多技术问题要处理。普通的手机如果打开数据录像,10s的数据就有100多兆。如何处理这样的数据就设计到编码问题。这是一个比较大的坑。另外,还有就是带宽问题了。无论你编码压缩的多好,用户量如果上去,其带宽使用是相当可观。不同地域,不同电信提供商的都要考虑。另外就是服务器并发推送的处理。10万个用户和500万的用户视频推送处理是个不小的挑战。而本文对于以上问题都不做讨论。仅仅是个局域网手机直播demo。

代码架构


      先说下实现原理。通过调用Android Camera,通过onReviewListener进行数据的获取。

camera.setPreviewCallback(new Camera.PreviewCallback() {

					@Override
					public void onPreviewFrame(byte[] data, Camera camera) {
						//获取当前的屏幕预览的像素 长与高
						int mWidth = camera.getParameters().getPreviewSize().width;
						int mHeight = camera.getParameters().getPreviewSize().height;
						Log.e(TAG, "mWidth >" + mWidth + " mHeight" + mHeight);
						Log.e(TAG, "data length >" + data.length);
						// int[] buf = imageUtilEngine.decodeYUV420SP(data,
						// mWidth,
						// mHeight);

						// 对要发送的数据进行封装 进行 TLV 格式的封装 TAG L length V 长度
						// TAG 为: width 0xF0 0xFF, height 0xF1 0xFF, data 0xF2
						// 0xFF
						// 为了方便查询 0xF0 0xFF 为 开始标志位 。+(width 4位)+(height 4位)+
						// (data长度 4 位) + data
						
						//对获取的数据进行打包处理
						int length = 2 + 4 + 4 + 4 + data.length;
						ByteBuffer bb = ByteBuffer.allocate(length);

						bb.put(new byte[] { (byte) 0xF0, (byte) 0xFF });

						bb.put(Utils.intToBytes2(mWidth));
						bb.put(Utils.intToBytes2(mHeight));
						bb.put(Utils.intToBytes2(data.length));

						bb.put(data);
						//执行发送命令操作
						sendData(bb.array());
					}
				});

以上是一种获取预览信息的方式。除了此种方式,还有通过MediaRecorder的方式。获取视频信息。

还有一种直接把SurfaceView引用传下去,使用NDK调用Camera,直接获取数据源信息。

此种方式效率最高。但是这是Android工程师要求熟练NDK操作。

考虑过没,那个预览获得的数据是什么数据?

这个是大名鼎鼎的YUV数据。你搜索下这种数据格式。它算是各种视频流获取的第一手数据。原生数据。

对于YUV数据如何在客户端显示出来呢?这就是另一个问题了。理论上SurfaceView可以直接显示的。但是Java层并没有提供

相关接口。你需要调用NDK层里实现。





没写完,待续

代码工程:

http://download.csdn.net/detail/a315823806/9699223


  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值