腾讯互动直播 音频 视频 踩过的坑
来源:互联网 发布:国家注册审核员 知乎 编辑:程序博客网 时间:2024/04/29 18:16
腾讯互动直播 音频 视频 踩过的坑 一
由于公司业务需要互动直播业务,再调用腾讯的sdk的时候,由于是小公司,很难即使得到腾讯技术人员回复,以下将列举我再音频,视频这块遇到一些坑
腾讯互动sdk的地址:https://github.com/zhaoyang21cn/ILiveSDK_Android_Demos
1,由于公司业务需要对互动直播观众端音频可以进行加密,听不清,只有互动两个人才能正常对话,查找腾讯的sdk发现
通过上图可以看到,只有6可以叠加一段音乐,其他5,7不能改变原来声音,所以想通过回调直接把音频加密再去播放通过上述方式是做不到。
2,只能想其他的方法,后来看到腾讯的sdk有
public boolean enableSpeaker(boolean var1, AVAudioCtrl.EnableSpeakerCompleteCallback var2) { return this.mIsCalling?false:this.nativeEnableSpeaker(var1, var2); }这个接口通过字面意思是关闭扬声器,以下是官方文档表述
enableSpeakerpublic boolean enableSpeaker(boolean isEnable)开启或关闭扬声器/耳机。同步返回结果。此方法操作的物理设备和setAudioOutputMode(int)有关系。输出模式为OUTPUT_MODE_SPEAKER,则操作的是扬声器。输出模式为OUTPUT_MODE_HEADSET,则操作的是耳机。Parameters:isEnable - true表示开启,false表示关闭。Returns:true表示设置成功,false表示失败。
再调用这个接口切记要再主线程否则会返回 1,或者1201, 1007, 1002.
查找AVError类可以清楚的看到错误的意思
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.tencent.av.sdk;public class AVError { public static final int AV_OK = 0; public static final int AV_ERR_FAIL = 1; public static final int AV_ERR_REPETITIVE_OPERATION = 1001; public static final int AV_ERR_EXCLUSIVE_OPERATION = 1002; public static final int AV_ERR_HAS_IN_THE_STATE = 1003; public static final int AV_ERR_INVALID_ARGUMENT = 1004; public static final int AV_ERR_TIMEOUT = 1005; public static final int AV_ERR_NOT_IMPLEMENTED = 1006; public static final int AV_ERR_NOT_IN_MAIN_THREAD = 1007; public static final int AV_ERR_RESOURCE_IS_OCCUPIED = 1008; public static final int AV_ERR_CONTEXT_NOT_START = 1101; public static final int AV_ERR_CONTEXT_NOT_STOP = 1102; public static final int AV_ERR_ROOM_NOT_EXIST = 1201; public static final int AV_ERR_ROOM_NOT_EXITED = 1202; public static final int AV_ERR_DEVICE_NOT_EXIST = 1301; public static final int AV_ERR_ENDPOINT_NOT_EXIST = 1401; public static final int AV_ERR_ENDPOINT_HAS_NOT_VIDEO = 1402; public static final int AV_ERR_TINYID_TO_OPENID_FAILED = 1501; public static final int AV_ERR_OPENID_TO_TINYID_FAILED = 1502; public static final int AV_ERR_NOT_TRY_NEW_ROOM = 2001; public static final int AV_ERR_TRY_NEW_ROOM_FAILED = 2002; public static final int AV_ERR_SERVER_FAILED = 10001; public static final int AV_ERR_SERVER_NO_PERMISSION = 10003; public static final int AV_ERR_SERVER_REQUEST_ROOM_ADDRESS_FAIL = 10004; public static final int AV_ERR_SERVER_CONNECT_ROOM_FAIL = 10005; public static final int AV_ERR_SERVER_FREE_FLOW_AUTH_FAIL = 10006; public static final int AV_ERR_IMSDK_UNKNOWN = 6999; public static final int AV_ERR_IMSDK_TIMEOUT = 7000; public static final int AV_ERR_UNKNOWN = 65536; public static final int AV_ERR_SOUTIL_INTERNAL_MEMORY_NOT_ENOUGH = 10101; public static final int AV_ERR_SOUTIL_INTERNAL_ERROR = 10102; public AVError() { }}结合帮助文档
static intAV_ERR_CONTEXT_NOT_START AVContext没有启动static intAV_ERR_CONTEXT_NOT_STOP AVContext未结束static intAV_ERR_DEVICE_NOT_EXIST 设备不存在static intAV_ERR_ENDPOINT_HAS_NOT_VIDEO 该成员没有上视频static intAV_ERR_ENDPOINT_NOT_EXIST 房间成员不存在static intAV_ERR_EXCLUSIVE_OPERATION 互斥操作。已经在进行某种操作,再次去做同类型的其他操作,则返回这个错误static intAV_ERR_FAIL 一般错误static intAV_ERR_HAS_IN_THE_STATE 已经处于所要状态,无需再操作。如设备已经打开,再次去打开,就返回这个错误码static intAV_ERR_IMSDK_TIMEOUT static intAV_ERR_IMSDK_UNKNOWN IMSDK内部错误static intAV_ERR_INVALID_ARGUMENT 错误参数static intAV_ERR_NOT_IMPLEMENTED 功能未实现static intAV_ERR_NOT_IN_MAIN_THREAD 不在主线程中执行操作
可以看到错误原因从而解决错误,最终实现了关闭观众端的扬声器。
3,观众端的扬声器关闭,那怎么能让观众听到加密的声音呢,很显然,这里需要对上边的5,7回调进行操作,上述5的回调可以拿到两路主播任意一路的声音,也可以通过上图的7的,拿到两个主播混流的声音,当我拿到他们回调的数据,通过调用android原声的AudioTrack进行播放声音
m_out_buf_size = AudioTrack.getMinBufferSize(48000, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT); // 实例化播放音频对象 m_out_trk = new AudioTrack(AudioManager.STREAM_MUSIC, 48000, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, m_out_buf_size, AudioTrack.MODE_STREAM);对回调里边数据进行播放
ILiveSDK.getInstance().getAvAudioCtrl().registAudioDataCallbackWithByteBuffer(AVAudioCtrl.AudioDataSourceType.AUDIO_DATA_SOURCE_PLAY, new AVAudioCtrl.RegistAudioDataCompleteCallbackWithByteBuffer() { @Override public int onComplete(AVAudioCtrl.AudioFrameWithByteBuffer audioFrameWithByteBuffer, int i) { if (play_flag == 2){ Log.d("jni", "start len = " + audioFrameWithByteBuffer.dataLen); audio.VoiceDisposeWriteBuf(audioFrameWithByteBuffer.data.array(), 960); audio.VoiceDisposeRead(960); audio.VoiceDisposeReadBuf(audio_buf, 960); m_out_trk.write(audio_buf, 0, audioFrameWithByteBuffer.dataLen); Log.d("jni", "m_out_trk.write len = " + audioFrameWithByteBuffer.dataLen); } //Log.d("jni", "play_flag = " + play_flag); return 0; } });
这样就完成了对观众端数据进行加密
阅读全文
0 0
- 腾讯互动直播 音频 视频 踩过的坑
- 腾讯互动直播 音频 视频 踩过的坑 二
- 腾讯高级音视频架构师郭亮:解密互动直播技术
- Android集成腾讯互动直播如何切换流视频
- 腾讯互动直播基于独立模式的流程解析
- 视频直播,音频直播,m3u8
- 丢弃RTMP协议的FLASH视频直播方案所踩过的坑
- 丢弃RTMP协议的FLASH视频直播方案所踩过的坑
- 专业的直播APP音视频互动开发平台
- 腾讯云互动直播SDK集成综述
- 腾讯 互动直播 ios soundtouch 崩溃问题
- 腾讯云互动直播分享屏幕小结
- 网易视频云:连麦互动直播将成直播体验深度优化的必然形式
- Android安卓腾讯云互动直播随心播横屏的实现方式1.8.2
- 网易视频云朱玲:互动直播场景下的视频核心技术实践
- 网易视频云朱玲:互动直播场景下的视频核心技术实践
- 网易视频云朱玲:互动直播场景下的视频核心技术实践
- 直播利器---AnyRTC实时视频连麦互动直播
- ice windows
- 【bzoj1941】[Sdoi2010]Hide and Seek
- 'release' is unavailable: not available in automatic reference counting modeAutomatic
- android 之RadioGroup 的换行
- SSL For Free 申请免费https SSL 凭证
- 腾讯互动直播 音频 视频 踩过的坑
- maven WEB项目启动没问题访问页面就报错:org.apache.jasper.JasperException: Unable to compile class for JSP
- GitHub项目总结
- 使用Spring Security给Spring Boot Admin做一个安全验证登录
- 基于Quartus II 和MATLAB 的FIR滤波器设计与仿真(一)
- js变量作用域白话级讲解
- 专业单词
- 用ng-repeat循环出一个不规则的表格
- Cookie与Session的区别-总结很好的文章