libstreaming源码分析二之MediaRecorder编码

 上一篇介绍了libstreaming的RTSP连接,连接成功后,即可将编码后的视频流打包发送。本文主要研究libstreaming的MediaRecorder编码。

 
一、RTSP连接成功后,开始编码
在startStream()方法中,主要实现了两个功能:rtsp连接;连接成功后开始调用MeidaStream.start(),开始编码:

libstreaming源码分析二之MediaRecorder编码_第1张图片
libstreaming源码分析二之MediaRecorder编码_第2张图片
Session.java:syncStart(),开启videostream
libstreaming源码分析二之MediaRecorder编码_第3张图片

libstreaming源码分析二之MediaRecorder编码_第4张图片


MediaStream.java:start()

libstreaming源码分析二之MediaRecorder编码_第5张图片



二、至此,我们看到根据MediaStream.mMode,可选择两种编码方法:MediaRecorder和MediaCodec。两种方法都是硬编码,MediaCodec是新API,需要Android API在18以上;MediaRecorder要与LocalSocket结合使用。
MeidaStream.java中定义了abstract 方法 encodeWithMediaRecorder(),在VideoStream.java中实现了该方法。
libstreaming源码分析二之MediaRecorder编码_第6张图片 libstreaming源码分析二之MediaRecorder编码_第7张图片
libstreaming源码分析二之MediaRecorder编码_第8张图片

可以看到,mMediaRecorder.start()方法执行后,mReciever.getInputStream()方法输出的流就是已经编码的流。
而 mMediaRecorder.setVideoEncoder(mVideoEncoder)中,mVideEncoder在VideoStream.java的子类H264Stream.java和H263Stream.java中被初始化,由此设置H264编码和H263编码。

三、LocalSocet设置
MeidaStream.java中,设置了LocalSocket
libstreaming源码分析二之MediaRecorder编码_第9张图片
注意:从github下载的libstreaming,在有的手机上可能会出现“Couldn't skip mp4 header”,可能是由于LocalSocket设置的连接超时引起的。
解决方法:在MediaStream.java中,找到方法 createSockets(),注释掉 mReceiver.setSoTimeout(3000);

四、将mReceiver.getInputStream() 流传入 mPacketizer,开始RTP打包。
libstreaming源码分析二之MediaRecorder编码_第10张图片

你可能感兴趣的:(流媒体)