Registro de desarrollo de intercomunicador de audio y video Linphone3.5.2 ARM RV1109

Registro de desarrollo de intercomunicador de audio y video Linphone3.5.2 ARM RV1109

ilustrar

Este es un registro posterior al evento. Registra principalmente algunos puntos clave centrales. Puede haber muchos detalles que no se registran. ¡Es principalmente para facilitar su propia recuperación más adelante!

Versión 3.5.2

¡Alguna razón para elegir una versión tan antigua!
Para nuevos desarrollos, es mejor elegir una versión más nueva, como 4.5, 4.2, 3.8, etc.

Como nunca antes había desarrollado una aplicación Linphone, no entiendo el marco completo y estoy completamente confundido. ¡Encontré mucha información en línea!

Debido a que solo se registra después, registremos las operaciones principales a continuación y brindemos instrucciones para otros desarrolladores que necesiten conectarse más adelante.

¡Me tomó casi dos semanas obtener una comprensión general de este marco!
Así que creo que la siguiente implementación es una solución más adecuada: el cambio mínimo es en el código del marco de Linphone y la implementación de audio y video se coloca en la aplicación de la aplicación.
El algoritmo 3A para el procesamiento de audio y la codificación y decodificación de video no tiene nada que ver con Linphone, y Linphone no necesita vincularse a la biblioteca para acoplarse a la plataforma de la aplicación durante la compilación.

Descripción general de la aplicación

¡Mi placa base es RV1109, un producto de tableta frontal, que se utiliza como máquina de puertas y puertas de la comunidad! ¡Debe llamar a la extensión interior o al teléfono de la propiedad!

Linphone tiene procesamiento estándar para audio y video, ¡pero el procesamiento de audio y video en plataformas integradas a menudo no es estándar! Los métodos de varios fabricantes no son estándar. Por ejemplo, muchas plataformas integradas no son
compatibles con ALSA de forma predeterminada. No sigue el marco V4L2 y el códec tiene su propia implementación de SDK.
En este momento, debe implementar algunos equipos de procesamiento de audio y video de bajo nivel de Linphone usted mismo.

Por ejemplo, en esta plataforma, puedes implementar tu propia lógica de procesamiento de audio y video.

definir msfilterID

En la clase de enumeración: typedef enum MSFilterId, definimos nuestra propia ID de audio y video

typedef enum MSFilterId
	...
	...
	MS_H264Stream_CUS_ID,
	MS_H264_ENC_CUS_ID,
	MS_H264_DEC_CUS_ID,
} MSFilterId;

Escribir el equipo de audio y video correspondiente.

Para los filtros definidos anteriormente, MS_H264Stream_CUS_ID, MS_H264_ENC_CUS_ID, MS_H264_DEC_CUS_ID, ¡debemos implementarlos en consecuencia!

Para los filtros definidos por el usuario, mediastreamer2 proporciona las funciones de registro correspondientes. No es necesario escribir esta parte del código en linphone, por lo que podemos escribirlo en nuestra propia aplicación de aplicación.

Para audio:

Linphone también tiene una implementación de ALSA en el dispositivo de audio, pero nosotros usamos la configuración de mezcla de ALSA, que tiene algunas diferencias. Al mismo tiempo, los datos de audio deben ser procesados ​​por 3A antes de enviarlos, como la cancelación de eco y eliminación de ruido. Si esta parte del código
es Es más problemático escribirlo en Linphone. Para mayor comodidad, es mejor implementar el procesamiento de audio en la aplicación usted mismo. Al mismo tiempo, es posible que muchas placas base integradas ARM no proporcionen la adaptación de la interfaz ALSA. , por lo que, en muchos casos, es sencillo implementar un MSSndCardDesc usted mismo
.

La declaración específica es la siguiente: para la implementación de cada método, simplemente mire la implementación de ALSA en mediastreamer2 y simplemente compare la implementación.

	MSSndCardDesc alsa_card_desc={
		.driver_type="ALSA",
		.detect=alsa_card_detect,
		.init=alsa_card_init,
		.set_level=alsa_card_set_level,
		.get_level=alsa_card_get_level,
		.set_capture=alsa_card_set_source,
		.set_control=NULL,
		.get_control=NULL,
		.create_reader=alsa_card_create_reader,
		.create_writer=alsa_card_create_writer,
		.uninit=alsa_card_uninit,
		.duplicate=alsa_card_duplicate,
		.unload = NULL
	};

	bool Linphone_AlsaMSFilter::linphone_Alsa_init()
	{

		static MSSndCardManager *cm = NULL;

		if(cm)
		{
			return true;
		}

		cm = ms_snd_card_manager_get();
		ms_snd_card_manager_register_desc(cm, &alsa_card_desc);

		return true;
	}

Para vídeos:

Debido a que el video se procesa a través de hardware, soluciones como RV1109 y HiSilicon llaman a códecs físicos, por lo que ya sea que reciba o envíe transmisiones de video, Linphone solo es responsable de recibir o enviar transmisiones como H264, y no es responsable de codificar y
decodificar
. entonces aquí necesitamos procesar las fuentes de codificación, decodificación y dispositivos de video en mediaStreamer2. ¡Implemente su propio códec y dispositivo fuente de video respectivamente! ¡
La implementación específica es diferente en cada plan! ¡La definición básica es la siguiente!

	//定议两个并不需要的编解码器,这是应为我没有编译FFMPEG进来!
	MSFilterDesc ms_h264_enc_desc={
		.id=MS_H264_ENC_CUS_ID,
		.name="MSh264EncCus",
		.text=("A video H264 encoder using ffmpeg library."),
		.category=MS_FILTER_ENCODER,
		.enc_fmt="H264",
		.ninputs=0, /*MS_YUV420P is assumed on this input */
		.noutputs=0,
		.init=enc_h264_init,
		.preprocess=enc_preprocess,
		.process=enc_process,
		.postprocess=enc_postprocess,
		.uninit=enc_uninit,
		.methods=methods,
		.flags = 0,
	};
	
	MSFilterDesc ms_h264_dec_cus_desc={
		.id=MS_H264_DEC_CUS_ID,
		.name="MSH264DecCus",
		.text="A H264 decoder based on ffmpeg project.",
		.category=MS_FILTER_DECODER,
		.enc_fmt="H264",
		.ninputs=1,
		.noutputs=1,
		.init=dec_init,
		.preprocess=NULL,
		.process=dec_process,
		.postprocess=NULL,
		.uninit=dec_uninit,
		.methods=h264_dec_methods,
		.flags=0
	};

	
	//在一个合适的地方注册filter
	ms_filter_register(&ms_h264_dec_cus_desc);
	
	ms_filter_register(&ms_h264_enc_desc);
	
	
	//定义真正传输H264视频的Filter
	MSFilterDesc ms_h264Stream_desc={
		.id=MS_H264Stream_CUS_ID,
		.name="MSH264StreamReadCus",
		.text="Ms H264 Stream read source Cus",
		.category=MS_FILTER_OTHER,
		.enc_fmt = NULL,
		.ninputs=0,
		.noutputs=1,
		.init=h264Stream_read_init,
		.preprocess=h264Stream_read_preprocess,
		.process=h264Stream_read_process,
		.postprocess=h264Stream_read_postprocess,
		.uninit=h264Stream_read_uninit,
		.methods=h264Stream_read_methods,
		.flags=0
	};
	
	//初始化注册filter
	bool Linphone_h264msfilter::Linphone_h264msfilter_init()
	{
		 static MSWebCamManager* pMSWebCamManager= ms_web_cam_manager_get();

		 if(!pMSWebCamManager)
		 {
			 return true;
		 }

		 ms_web_cam_manager_register_desc(pMSWebCamManager, &ms_h264Stream_card_desc);

		return true;
	}

Modificaciones en varios puntos clave

Un flujo básico para el procesamiento de vídeo:

linphone_core_update_streams->linphone_call_start_media_streams->linphone_call_start_video_stream->video_stream_start

linphone_call_start_video_stream En este proceso, el objeto fuente de video se actualiza (vstream)

Crear filtros y configuraciones de contexto correspondientes a VIDEO

videostream.c:video_stream_start
ms_filter_link

Los datos de la cámara del dispositivo se han codificado en datos H264. Modifique la configuración ms_filter_link en video_stream_start para que apunte directamente desde la fuente de datos a RTP.

	if(stream->source->desc->id == MS_H264Stream_CUS_ID)
	{
		ms_filter_link (stream->source, 0, stream->rtpsend, 0);			
	}
	else
	{
		ms_filter_link (stream->source, 0, stream->pixconv, 0);
		ms_filter_link (stream->pixconv, 0, stream->sizeconv, 0);
		ms_filter_link (stream->sizeconv, 0, stream->tee, 0);
		ms_filter_link (stream->tee, 0 ,stream->encoder, 0 );
		ms_filter_link (stream->encoder,0, stream->rtpsend,0);
		
		if (stream->output2){
			if (stream->preview_window_id!=0){
				ms_filter_call_method(stream->output2, 
					MS_VIDEO_DISPLAY_SET_NATIVE_WINDOW_ID,&stream->preview_window_id);
			}
			
			ms_filter_link(stream->tee,1,stream->output2,0);
		}
	}

Hay varios lugares en este archivo que requieren modificaciones correspondientes en la relación ms_filter_link. No los enumeraré uno por uno aquí, ¡están todos en este archivo!

Varias interfaces de configuración relacionadas con audio y vídeo.

Se debe prestar atención a varias interfaces relacionadas con audio y video, porque después de configurar estos parámetros, afectará la apertura y cierre del equipo de audio y video.

linphone_core_enable_video

Configuración de la interfaz de video, configure si hay una cámara y si desea mostrar video. Después de esta configuración, se configurarán los indicadores de captura y visualización de video_conf.

linphone_call_enable_camera

Establecer si se enciende la cámara

linphone_call_params_enable_early_media_sending

Establecer si enviar audio y video antes de responder

Supongo que te gusta

Origin blog.csdn.net/jhting/article/details/132924856
Recomendado
Clasificación