最近调研android视频录制、另一部手机实时观看,大致有以下几种思路。

1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:8080网址观看。

这种方案可以参考 ipcamera-for-android开源项目,网址  http://code.google.com/p/ipcamera-for-android/source/checkout

可以运行的源代码可以在这下载            http://download.csdn.net/detail/xiaoliouc/4933558

缺点:android手机必须支持MP4+ARM_NB格式,有些手机不兼容,延时有点厉害,前面调研在googlecode看到的代码,现在看来方案不可取

2. android手机采用juv-rtmp-client.jar包,网上有收费的包,但可以搜索破解包,通过rtmp协议发布服务到red5服务器。服务器当然是red5了,可以用red5自带的的OFLA Demo做测试。客户端代码可以参考ivideochat,下载地址    http://download.csdn.net/detail/xiaoliouc/4933594

使用支持rtmp协议的播放器播放,如ffplay。

缺点:demo延迟很厉害,仅供参考。rtmp协议半公开,难度比较大

3.android手机通过camera类拍摄视频。把一帧一帧的图像压缩通过socket发送到服务器,服务器可以直接观看。而要想让另一台手机也能观看,可以让服务器转发来实现。例子网上有很多,http://download.csdn.net/detail/xiaoliouc/4933610

缺点:通过一帧一帧的发送数据,传输过程耗费大量流量。玩玩可以,但实际项目中不可取。

4.android手机通过camera类拍摄视频,把拍摄的视频通过h264编码,可以采用软编码(使用x264库或者opencore软件库),java类通过jni调用编译后的so文件来实现。然后通过基于udp的rtp协议传输到服务器。为什么不使用tcp协议呢,因为tcp的重传机制会产生延时和抖动,而单独使用udp传输协议本身是面向无连接的,不能提供质量保证,需要在udp协议只上采用rtp或者rtcp提供流量控制和拥塞控制服务。服务器通过ffmpeg对接收的h264解码并播放。播放可以使用VLC media player。如果对c++比较熟悉,可以看看live555这个开源项目。

缺点:需要用到的知识点比较多,jni,h264编解码 ,rtp协议等。使用软编码,手机cpu运算量比较大,容易发热。

5.android手机通过mediaRecorder类拍摄视频,其中当然包括音频了。把拍摄的视频通过h264编码,可以采用硬编码(面向手机的硬件直接操作),只能针对3gp,mp4视频格式。方法参考  http://blog.csdn.net/zblue78/article/details/6078040

这篇博客,里面讲的很详细,提取h264的sps,pps,可以参考     http://blog.csdn.net/peijiangping1989/article/details/6934317

winHex是一款好用的16进制查看工具,下载地址           http://download.csdn.net/detail/xiaoliouc/4928773

代码网上有很多,个人理解是:mediaRecorder录制视频(3gp,MP4),可以通过mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());预览视频,通过localsocket发送到本地的localserversocket的h264实时视频流。这个过程涉及到硬编码,硬编码个人理解是,在预览过程或者提前确定视频的sps,pps,head(一般为0x00000001),不同的手机硬件不一样。把得到的这些参数写入h264,得到正确的h264视频流,然后把流推送到流媒体服务器,使用支持rtsp协议的播放器播放,比如vlc。

6、采用HLS协议,服务器采用nginx,ffmpeg解码。nginx服务器搭建过程,ffmpeg安装过程  见我前几篇文章。

然后用ffmpeg对解码后的mp4文件进行ts切片,生成带有索引的m3u8文件,然后客户端就可以通过浏览器http://ip:port/ *.m3u8访问。

7.相对容易、且效果不错的方法,android手机上搭建rtsp服务器,另一台手机使用VLC播放器输入rtsp://ip:port/播放视频。具体原理是,通过android手机对mediaRecorder录制视频,把localsocket传输到本地的流经过硬编码,添加rtp头,分离NALU包,根据rtsp协议交互过程把数据发送到对方。

代码可以参考spydroid了,源代码可以通过svncheckout,能够正常运行,且效果不错。

http://code.google.com/p/spydroid-ipcamera/source/checkout     。

网上还没有分析spydroid源码的文章,等自己空了有机会分析下源代码。

8.前面讲的都是单向视频,如果是双向视频,其实就是视频会议了,可以参考sipdroid开源源代码了,网址:         http://code.google.com/p/sipdroid/source/checkout

android视频录制、另一部手机实时观看方案的更多相关文章

  1. Android视频录制从不入门到入门系列教程(三)————视频方向

    运行Android视频录制从不入门到入门系列教程(二)————显示视频图像中的Demo后,我们应该能发现视频的方向是错误的. 由于Android中,Camera给我们的视频图片的原始方向是下图这个样子 ...

  2. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

  3. 利用FFmpeg玩转Android视频录制与压缩(二)<转>

    转载出处:http://blog.csdn.net/mabeijianxi/article/details/72983362 预热 时光荏苒,光阴如梭,离上一次吹牛逼已经过去了两三个月,身边很多人的女 ...

  4. android 视频录制 混淆打包 之native层 异常的解决

    原文地址:http://www.cnblogs.com/linguanh/    (滑至文章末,直接看解决方法) 问题起因: 前5天,因为项目里面有个类似 仿微信 视频录制的功能, 先是上网找了个 开 ...

  5. Android视频录制从不入门到入门系列教程(四)————Camera Parameter

    Camera提供了一个叫做setParameters的方法帮助开发者设置相机的相关参数. 通过Camera的getParameters方法可以获取到当前为相机设置的相关参数. 下面简单介绍下,视频录制 ...

  6. Android视频录制命令screenrecord

    不管是教学,还是为了演示,如果能将Android手机(或平板)的屏幕录制成视频文件,那是一件非常酷的事(iOS8已经提供了这一功能,能通过OS X直接在Mac上录制iPad.iPhone的屏幕,win ...

  7. Android拓展系列(9)--Android视频录制screenrecord命令

    在Android4.4 Kitkat上集成了一个比较好用的视频录制功能.参考:http://forums.androidcentral.com/android-4-4-kitkat/329674-ho ...

  8. 我的Android进阶之旅------>Android视频录制小例子

    ============================首先看看官网上关于视频捕捉的介绍================================ Capturing videos Video ...

  9. Android视频录制从不入门到入门系列教程(二)————显示视频图像

    1.创建一个空的工程,注意声明下列权限: <uses-permission android:name="android.permission.CAMERA"/> < ...

随机推荐

  1. HTTP协议3之压缩--转

    HTTP内容编码和HTTP压缩的区别 HTTP压缩,在HTTP协议中,其实是内容编码的一种. 在http协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码. 从而达到压缩的 ...

  2. 调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备

    将模拟器改为Ipad时,调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备是否为Ipad,但程序并 ...

  3. C#中的委托和游戏中的运用

    C#中的委托与游戏中的运用 1.什么是委托 在C/C++中,有函数指针的概念,即指向函数的指针.当我们调用该指针时,就相当于调用了该指针所指向的函数,这就是函数指针的一个作用,而他另一个作用就是将自己 ...

  4. TRI 解题报告

    题目大意: 在一个平面上有N(N <= 1000)个点,其中任意三点不共线,求这些点组成的三角形的面积和每和三角形内部含的点数的个数和. 数据范围: 20%的数据 N <= 50, 30% ...

  5. jquery 源码分析

    想给自己一个任务,接下来要分析jquery源码,然后按照jquery的思想打造一个适合webkit的类jquery微框架,一切从模仿起!

  6. project euler 25 fibonacci

    数学方法: Saying that a number contains 1000 digits is the same as saying that it's greater than 10**999 ...

  7. information_schema.key_column_usage 学习

    information_schema.key_column_usage 表可以查看索引列上的约束: 1.information_schema.key_column_usage 的常用列: 1.cons ...

  8. sql中插入多条记录-微软批处理

    这是使用批处理的一个例子: System.IO.StreamWriter messagelog = null; string messageString = ""; SqlConn ...

  9. Ubuntu14.04LST 安装Oracle SQL Developer 4.0.2

    1:Oracle SQL Developer 4.0.2下载链接: http://www.oracle.com/technetwork/developer-tools/sql-developer/do ...

  10. 【温故而知新-万花筒】C# 异步编程 逆变 协变 委托 事件 事件参数 迭代 线程、多线程、线程池、后台线程

    额基本脱离了2.0 3.5的时代了.在.net 4.0+ 时代.一切都是辣么简单! 参考文档: http://www.cnblogs.com/linzheng/archive/2012/04/11/2 ...