EasyRTMP是一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等方面。
有的用户咨询我们EasyRTMP-Android推流能不能自由支配音频,为什么同时推音频流和视频流时,视频画面很容易出现卡死的状态?本文我们来分享一下EasyRTMP-Android 在推流音视频过程中,这种情况出现的原因。
在EasyRTMP-Android推流组件初始化推流时,使用了mEasyPusher.initPush(url, context, callback); 即同时推流音视频,此时底层推流库的时间戳会同步到音频的时间戳,那么当推流过程中停止推流音频时,因为没有音频时间戳了,时间戳的处理就出错了,播放器解析不了视频帧数据了,画面就卡住不动了。
因为底层库需要同步音频时间戳,所以停止采集音频时,还需要继续推流音频,那么可以继续推流默认的无声的音频,开启/关闭默认音频推流的线程如下:
public void start() {
enableAudio = true;
openDefaultAudio = false;
stopAacThread();
startRecord();
}
public void stopAudio() {
enableAudio = false;
openDefaultAudio = true;
stop();
}
单独推流默认音频的线程代码如下:
aacThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (enableAudio) {
break;
}
Collection<Pusher> p;
synchronized (AudioStream.this) {
p = sets;
}
Iterator<Pusher> it = p.iterator();
// 推流
while (it.hasNext()) {
Pusher ps = it.next();
char[] aacData;
if (is8K) {
aacData = gAACMuteData;
} else {
// SRS服务器接收不了8k音频
aacData = gAACMuteData1;
}
try {
ps.push(new String(aacData).getBytes("UTF-8"),
0,
aacData.length,
mBufferInfo.presentationTimeUs / 1000,
0);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Log.v(TAG, "push audio");
}
try {
Thread.sleep(128);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
因此我们增加以上两段代码,既可把音频流和视频流的解码数据分开,达到停止采集音频,视频也可以正常播放的目的。
那么本文EasyRTMP推流组件的介绍就到这里了,如果大家还有兴趣或者有需求,欢迎联系我们,TSINGSEE青犀视频云边端架构产品均为大家提供了试用版本,欢迎大家来进行测试。