Android Red5视频通讯第四篇:推流
1.布局视频预览
<com.xxx.xxx.WechatCameraView
android:id="@+id/wechat_cameraview"
android:layout_width="79px"
android:layout_height="106px"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true" />
2.初始化publishClient,camera,audioMicro,publishstream,以及回调接口
var publishClient: INetConnection? = null;
var camera: WechatCamera? = null
var audioMicro: WechatAudioMicro? = null
var publishstream: UltraNetStream? = null
var disConnected=true
紧接着第一篇的连接成功的接口,赋值publishClient
/**
* 连接服务器接口回调
*/
val connectServerCallback = object : INetConnection.ListenerAdapter() {
override fun onAsyncError(source:NetConnection?,message:String?,e: Exception?) {
Log.i(TAG, "connectServerCallback onAsyncError: $message $e")
}
override fun onIOError(source: INetConnection?, message: String?)
{
Log.i(TAG, "connectServerCallback#onIOError: " + message!!)
}
override fun onNetStatus(source: INetConnection?, info: Map<String, Any>)
{
Log.i(TAG, "connectServerCallback #onNetStatus: $info")
val code = info["code"]
if (NetConnection.CONNECT_SUCCESS == code) {
//连接成功,取得publishClient
publishClient = source
disConnected=false
} else {
disConnected=true
publishClient = null;
}
}
}
/**
* 发布回调接口
*/
val outGoingCallPublishCallback = object : INetStream.ListenerAdapter()
{
override fun onNetStatus(iNetStream: INetStream?, info: Map<String, Any>) {
Log.i(TAG, "outGoingCallPublishCallback#onNetStatus: $info")
val code = info["code"]
when {
NetStream.PUBLISH_START == code -> {
//发布成功
Log.i(TAG, "outGoingCallPublishCallback PUBLISH_START")
}
NetStream.RECORD_START == code -> {
//开始记录
Log.i(TAG, "outGoingCallPublishCallback RECORD_START")
}
NetStream.UNPUBLISH_SUCCESS == code -> {
Log.i(TAG,"outGoingCallPublishCallbackUNPUBLISH_SUCCESS")
}
NetStream.PUBLISH_BADNAME == code -> {
Log.i(TAG, "outGoingCallPublishCallback PUBLISH_BADNAME")
}
}
}
}
3.初始化Micro和Camera
//调用initinitMicroAndCameta 方法初始化麦克风和摄像头
initMicroAndCameta(wechat_cameraview.wechatCamera)
/**
* 初始化摄像头和麦克风
* */
fun initMicroAndCameta(camera: WechatCamera)
{
this.audioMicro = WechatAudioMicro()
this.camera = camera
}
4.开始推流
/**向服务器推送视频流*/
fun outGoingCallPublish()
{
singleExecutor.execute(Runnable {
if (publishClient != null && !disconnected)
{
startRecord()
publishstream = UltraNetStream(publishClient)//新建发布流
publishstream!!.attachAudio(audioMicro)//设置麦克风
publishstream!!.attachCamera(camera, -1)//设置摄像头
publishstream!!.addEventListener(outGoingCallPublishCallback)//设置回调接口
}
publishName = publish(publishstream)
userProfile!!.publishid = publishName
})
}
/**
* 开始录制视频和声音
*/
private fun startRecord() {
if (camera != null)
camera!!.start()
if (audioMicro != null)
audioMicro!!.start()
}
/**
* 向服务器推送视频音频流
*/
private fun publish(publishStrem: UltraNetStream?): String {
if (publishStrem == null) {
Log.i(TAG, "publishStream not ready")
return ""
}
val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)
val hour = calendar.get(Calendar.HOUR_OF_DAY)
val min = calendar.get(Calendar.MINUTE)
val second = calendar.get(Calendar.SECOND)
val publishName = "" + year + (month + 1) + day + hour + min + second
Log.i(TAG, "publishStream publish:$publishName")
publishStrem?.publish(publishName, NetStream.RECORD)
return publishName
}