¿Cómo implementar videollamadas en el desarrollo de Android?
/**
* Video chat de Android
* 1. Inicializar SDK 2. Conectarse al servidor, 3. Iniciar sesión como usuario 4. Ingresar a la sala; 5. Abra el video local 6. Solicite el video de la otra parte
*/
clase pública VideoChatActivity extiende la actividad implementa AnyChatBaseEvent
{
privado AnyChatCoreSDK anychat ; // Core SDK
SurfaceView privado remotoSurfaceView; // Video de otra parte
SurfaceView privado localSurfaceView // Video local
ConfigEntity privado; configEntity;
private boolean bSelfVideoOpened = false; // Si el video local está abierto
private boolean bOtherVideoOpened = false // Si el video de la otra parte está abierto
private TimerTask mTimerTask; // Temporización
temporizador privado mTimer = new Timer(true);
controlador de controlador privado // Utilice el controlador para actualizar el video en tiempo real continuamente p>
private Listlt; userlist = new ArrayListlt (); // Guardar la lista de usuarios en línea
private int userid; Anular
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout. actividad_video_chat);
remoteSurfaceView = (SurfaceView) findViewById(R.id.surface_remote);
localSurfaceView = (SurfaceView) findViewById(R.id.surface_local); p>configEntity = ConfigService.LoadConfig(this);//Cargar configuración de videollamada
loginSystem(); //Inicializar el servidor de conexión SDK
mTimerTask = new TimerTask(){ p>
public void run() {
Mensaje mesasge = nuevo mensaje()
handler.sendMessage(mesasge)
}
p>
};
mTemporizador.
Schedule(mTimerTask, 1000, 100);
handler = new Handler(){
@Override
public void handleMessage(Mensaje de mensaje){
VideoChat(); // Muestra la pantalla de videollamada en tiempo real de forma continua
super.handleMessage(msg
}
};
super.handleMessage(msg);
}
}
p>}
// Inicializar el servidor de conexión SDK
private void loginSystem(){
if (anychat == null){
anychat = new AnyChatCoreSDK();
anychat.SetBaseEvent(this); // Establece la función de devolución de llamada de evento básica
if (configEntity.useARMv6Lib != 0) // Usando el conjunto de instrucciones ARMv6
anychat. SetSDKOptionInt(AnyChatDefine.
BRAC_SO_CORESDK_USEARMV6LIB, 1);
anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // Inicializar SDK
}
anychat.Connect("demo.anychat.cn", 8906); // Conectarse al servidor
}
// Muestra el tiempo pantalla de videollamada
public void VideoChat(){
if (!bOtherVideoOpened){
if (anychat. GetCameraState(userid) == 2 p>
amp; anychat.GetUserVideoWidth(userid) != 0){
titular de SurfaceHolder = remoteSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(id de usuario),
anychat.GetUserVideoHeight(id de usuario));
Surface s = holder.getSurface(); / Obtener la pantalla de video
anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // Llama a la API para mostrar la pantalla de video
bOtherVideoOpened = true;
}
if (!bSelfVideoOpened){
if (anychat.GetCameraState(-1) == 2
amp; anychat .GetUserVideoWidth(-1) != 0){
SurfaceHolder hol
der = localSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565
holder.setFixedSize(anychat.GetUserVideoWidth(-1),
anychat.GetUserVideoHeight(-1));
Superficie s = titular.getSurface();
anychat.SetVideoPos(-1, s, 0, 0, 0, 0);
bSelfVideoOpened = true;
}
}
}
public void OnAnyChatConnectMessage(boolean bSuccess){
if (!bSuccess){
Toast.makeText(VideoChatActivity.this, "Error al conectarse al servidor, vuelva a conectarse automáticamente, espere...", Toast.LENGTH_SHORT) . show();
}
anychat.Login("android", ""); // Conexión del servidor inicio de sesión exitoso
}
public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode){
if (dwErrorCode == 0) {
Toast.makeText(this, "¡Inicio de sesión exitoso!", Toast . LENGTH_SHORT).show();
anychat.EnterRoom(1, ""); // El usuario inició sesión correctamente y entró en la sala
ApplyVideoConfig(); >
} else {
Toast.makeText(this, "Error al iniciar sesión, código de error:" dwErrorCode, Toast.LENGTH_SHORT).show()
}
}
public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){
if (dwErrorCode == 0) { // Ingrese a la sala y abra con éxito el audio local y video
Toast .makeText(this, "Entró a la sala con éxito", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(-1, 1); video local
anychat .UserSpeakControl(-1, 1); // Activar audio local
} else {
Toast.makeText(this, "Error para ingresar a la sala, código de error:" dwErrorCode, Toast. LENGTH_SHORT).show();
}
}
public void OnAnyChatOnlineUserMessage(
int dwUserNum, int dwRoomId){
if (dwRoomId == 1){
int usuario[] = anychat.GetOnlineUser()
if (usuario) .length != 0){
for (int i = 0; i lt; usuario.length; i ){
userlist.add(user[i] "");
. }
String temp =userlist.get(0);
userid = Integer.parseInt(temp); .UserCameraControl(userid, 1); // Solicitar video del usuario
anychat.UserSpeakControl(userid, 1); // Solicitar audio del usuario
}
else); {
Toast.makeText(VideoChatActivity.this, "Actualmente no hay usuarios en línea", Toast.LENGTH_SHORT).show()
}
}
}
p>
}
public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){
if (bEnter) {//Nuevo usuario entra a la sala
userlist .add(dwUserId "");
}
else { //El usuario sale de la sala
p>if (dwUserId == ID de usuario)
{
Toast.makeText(VideoChatActivity.this, "El usuario del video está desconectado", Toast.LENGTH_SHORT).show(
anychat.UserCameraControl(userid, 0); //Desactivar el vídeo del usuario
anychat.UserSpeakControl(userid, 0); //Desactivar el audio del usuario
;userlist.remove(userid ""); //Eliminar el usuario
p>if (userlist.size() != 0)
{
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1); videos
anychat.UserSpeakControl(userid, 1); // Solicitar videos de otros usuarios Audio
}
}
141. else {
userlist.remove(dwUserId ""); //Eliminar el usuario
}
}
}
public void OnAnyChatLinkCloseMessage(int dwErrorCode){
>
Toast.makeText(VideoChatActivity.this, "Conexión cerrada, error:" dwErrorCode, Toast.LENGTH_SHORT).show()
}
@Override
protected void onDestroy(){ //Salir del programa
anychat.LeaveRoom(-1); //Salir de la sala
anychat.Logout() //Iniciar sesión out
anychat.Release(); //Liberar recursos
mTimer.cancel();
super.onDestroy(); > }
//Configurar los parámetros del vídeo según el archivo de configuración
private void ApplyVideoConfig(){
if (configEntity.configMode == 1) // Personalizar configuración de parámetros de video
{
//Establezca la velocidad de bits de la codificación de video local (si la velocidad de bits es 0, significa usar el modo de prioridad de calidad)
anychat.SetSDKOptionInt (AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL, configEntity.videoBitrate);
if (configEntity.videoBitrate == 0)
{
//Establecer la calidad de codificación de video local
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL, configEntity.videoQuality);
}
//Establecer la velocidad de fotogramas de la codificación de video local p>
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL, configEntity.videoFps);
//Establecer el intervalo de fotogramas clave para la codificación de vídeo local
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL , configEntity.videoFps * 4 );
//Establecer la resolución de captura de video local
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL, configEntity.solving_width
); anychat.SetSDKOptionInt(AnyChatDefine. BRAC_SO_LOCALVIDEO_HEIGHTCTRL, configEntity.solving_height);
//Establezca los parámetros predeterminados de codificación de video (cuanto mayor sea el valor, mayor será la calidad de la codificación y mayor el uso de recursos de la CPU)
anychat.SetSDKOptionInt (AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL, configEntity.
videoPreset);
}
// Deja que los parámetros del vídeo surtan efecto
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM, configEntity.configMode
);// Configuración de P2P
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC, configEntity.enableP2P);
// Configuración del modo de superposición de vídeo local
anychat. SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY, configEntity.videoOverlay);
// Configuración de cancelación de eco
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL, configEntity.enableAEC); // Configuración de codificación del hardware de la plataforma
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC, configEntity.useHWCodec);
// Configuración del modo de rotación de video
anychat.SetSDKOptionInt( AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL, configEntity.videorotatemode);
//Configuración del modo de reproducción fluida de vídeo
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_STREAM_SMOOTHPLAYMODE, configEntity.smoothPlayMode
); // Configuración del controlador de captura de video
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER, configEntity.videoCapDriver
//Configuración de corrección de color de captura de video local
anychat); .SetSDKOptionInt (AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA, configEntity.fixcolordeviation);
//Configuración del controlador de visualización de vídeo
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL, configEntity.videoShowDriver
<); p> }}