package com.laifeng.sopcastsdk.stream.sender.rtmp;
import com.laifeng.sopcastsdk.stream.packer.rtmp.RtmpPacker;
import com.laifeng.sopcastsdk.stream.sender.Sender;
import com.laifeng.sopcastsdk.stream.sender.rtmp.io.RtmpConnectListener;
import com.laifeng.sopcastsdk.stream.sender.rtmp.io.RtmpConnection;
import com.laifeng.sopcastsdk.stream.sender.sendqueue.ISendQueue;
import com.laifeng.sopcastsdk.stream.sender.sendqueue.NormalSendQueue;
import com.laifeng.sopcastsdk.stream.sender.sendqueue.SendQueueListener;
import com.laifeng.sopcastsdk.utils.WeakHandler;
/**
* @Title: RtmpSender
* @Package com.laifeng.sopcastsdk.stream.sender.rtmp
* @Description:
* @Author Jim
* @Date 16/9/21
* @Time 上午11:16
* @Version
*/
public class RtmpSender implements Sender, SendQueueListener {
private RtmpConnection rtmpConnection;
private String mRtmpUrl;
private OnSenderListener mListener;
private WeakHandler mHandler = new WeakHandler();
private ISendQueue mSendQueue = new NormalSendQueue();
@Override
public void good() {
mHandler.post(new Runnable() {
@Override
public void run() {
if(mListener != null) {
mListener.onNetGood();
}
}
});
}
@Override
public void bad() {
mHandler.post(new Runnable() {
@Override
public void run() {
if(mListener != null) {
mListener.onNetBad();
}
}
});
}
public interface OnSenderListener {
void onConnecting();
void onConnected();
void onDisConnected();
void onPublishFail();
void onNetGood();
void onNetBad();
}
public RtmpSender() {
rtmpConnection = new RtmpConnection();
}
public void setAddress(String url) {
mRtmpUrl = url;
}
public void setSendQueue(ISendQueue sendQueue) {
mSendQueue = sendQueue;
}
public void setVideoParams(int width, int height) {
rtmpConnection.setVideoParams(width, height);
}
public void setAudioParams(int sampleRate, int sampleSize, boolean isStereo) {
rtmpConnection.setAudioParams(sampleRate, sampleSize, isStereo);
}
public void setSenderListener(OnSenderListener listener) {
mListener = listener;
}
public void connect() {
rtmpConnection.setSendQueue(mSendQueue);
new Thread(new Runnable() {
@Override
public void run() {
connectNotInUi();
}
}).start();
if(mListener != null) {
mListener.onConnecting();
}
}
private synchronized void connectNotInUi() {
rtmpConnection.setConnectListener(listener);
rtmpConnection.connect(mRtmpUrl);
}
@Override
public synchronized void start() {
mSendQueue.setSendQueueListener(this);
mSendQueue.start();
}
@Override
public void onData(byte[] data, int type) {
if(type == RtmpPacker.FIRST_AUDIO || type == RtmpPacker.AUDIO) {
rtmpConnection.publishAudioData(data, type);
} else if(type == RtmpPacker.FIRST_VIDEO ||
type == RtmpPacker.INTER_FRAME || type == RtmpPacker.KEY_FRAME) {
rtmpConnection.publishVideoData(data, type);
}
}
@Override
public synchronized void stop() {
rtmpConnection.stop();
rtmpConnection.setConnectListener(null);
mSendQueue.setSendQueueListener(null);
mSendQueue.stop();
}
private RtmpConnectListener listener = new RtmpConnectListener() {
@Override
public void onUrlInvalid() {
sendPublishFail();
}
@Override
public void onSocketConnectSuccess() {
}
@Override
public void onSocketConnectFail() {
sendPublishFail();
}
@Override
public void onHandshakeSuccess() {
}
@Override
public void onHandshakeFail() {
sendPublishFail();
}
@Override
public void onRtmpConnectSuccess() {
}
@Override
public void onRtmpConnectFail() {
sendPublishFail();
}
@Override
public void onCreateStreamSuccess() {
}
@Override
public void onCreateStreamFail() {
sendPublishFail();
}
@Override
public void onPublishSuccess() {
mHandler.post(new Runnable() {
@Override
public void run() {
if(mListener != null) {
mListener.onConnected();
}
}
});
}
@Override
public void onPublishFail() {
sendPublishFail();
}
@Override
public void onSocketDisconnect() {
sendDisconnectMsg();
}
@Override
public void onStreamEnd() {
sendDisconnectMsg();
}
};
public void sendDisconnectMsg() {
mHandler.post(new Runnable() {
@Override
public void run() {
if(mListener != null) {
mListener.onDisConnected();
}
}
});
}
public void sendPublishFail() {
mHandler.post(new Runnable() {
@Override
public void run() {
if(mListener != null) {
mListener.onPublishFail();
}
}
});
}
}