最近调研android视频录制、另外一部手机实时观看,大体有如下几种思路。java
1. android手机充当服务器,使用NanoHTTPD充当服务器,另外一部手机或者pc经过输入http://手机的ip:8080网址观看。android
这种方案能够参考 ipcamera-for-android开源项目,网址 http://code.google.com/p/ipcamera-for-android/source/checkoutnginx
能够运行的源代码能够在这下载 http://download.csdn.net/detail/xiaoliouc/4933558c++
缺点:android手机必须支持MP4+ARM_BN格式,有些手机不兼容,延时有点厉害浏览器
2. android手机采用juv-rtmp-client.jar包,网上有收费的包,但能够搜索破解包,经过rtmp协议发布服务到red5服务器。服务 器固然是red5了,能够用red5自带的的OFLA Demo作测试。客户端代码能够参考ivideochat,下载地址 http://download.csdn.net/detail/xiaoliouc/4933594服务器
电脑能够直接经过安装了flash player浏览器观看,手机呢,能够找一个支持rtmp协议的播放器了。socket
缺点:须要flash支持tcp
3.android手机经过camera类拍摄视频。把一帧一帧的图像压缩经过socket发送到服务器,服务器能够直接观看。而要想让另外一台手机也能观看,可让服务器转发来实现。ide
例子网上有不少, http://download.csdn.net/detail/xiaoliouc/4933610svn
缺点:经过一帧一帧的发送数据,传输过程耗费大量流量。玩玩能够,但实际项目中不可取。
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视频流文件,而后把流经过rtp协议(或者其余)发送到服务器。服务器端对获得的h264用 ffmepg解码,播放。
貌似项目客户须要在苹果电脑,手机上播放。这个时候HLS协议就出来了,头疼的东西,服务器采用nginx,ffmpeg解码。nginx服务器搭建过程,ffmpeg安装过程 见我前几篇文章。
而后用ffmpeg对解码后的mp4文件进行ts切片,生成带有索引的m3u8文件,而后客户端就能够经过浏览器http://ip :port/ *.m3u8访问。
过程貌似是这样的,但本身因为刚接触不到一个周,还不太理解。
6.相对容易、且效果不错的方法,android手机上搭建rtsp服务器,另外一台手机使用VLC播放器输入rtsp://ip:port/播放 视频。具体原理是,经过android手机对mediaRecorder录制视频,把localsocket传输到本地的流通过硬编码,添加rtp头,分 离NALU包,根据rtsp协议交互过程把数据发送到对方。
代码能够参考spydroid了,源代码能够经过svncheckout,可以正常运行,且效果不错。
http://code.google.com/p/spydroid-ipcamera/source/checkout 。网上尚未分析spydroid源码的文章,等本身空了有机会分析下源代码。
7.前面讲的都是单向视频,若是是双向视频,其实就是视频会议了,能够参考sipdroid开源源代码了,网址 http://code.google.com/p/sipdroid/source/checkout
因为没有时间,就不研究这个了。