Linphone3.5.2 ARM RV1109音视频对讲开发记录

这篇具有很好参考价值的文章主要介绍了Linphone3.5.2 ARM RV1109音视频对讲开发记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linphone3.5.2 ARM RV1109音视频对讲开发记录

说明

这是一份事后记录,主要记录的几个核心关键点,有可能很多细节没有记上,主要是方便后面自己再找回来!

版本 3.5.2

一些原因选的是这样一个旧的版本!
新的开发最好选新一些的版本吧, 像 4.5, 4.2, 3.8 这一类的!

因为之前没有开发过Linphone的应用,所以对整个框架不了解,一头雾水! 上网找了比较多的资料!

因为只是事后记录,下面记录一下核心的操作,为后面其他需要对接的开发人员指示一下操作的路线吧!

前前后后,自己花了接近两周的时间,对这个框架大体了解了!
所以认为下面的实现是比较合适的方案了!最小的改动了Linphone框架代码,把音视频的实现都是放在APP应用中了。
在处理音频的3A算法,视频编解码都与Linphone无关,也不需要Linphone在编译时来链接应用平台对接的库。

整体应用概述

我的主板是RV1109,人脸平板产品,做为社区的门口、门栋机!需要呼叫室内分机或物业电话机!

在Linphone中有实现音视频的标准的处理,但往往在嵌入式平台上处理音视频上又是不标准的!各个厂家的方式
又不标准,比如很多嵌入式平台上默认上就不支持ALSA,视频也没有走V4L2的框架,编解码都有自己的SDK实现
这时就需要自己实现Linphone低层的一些音视频处理设备!

如在这个平台上即是自己实现的音视频处理逻辑!

定义msfilterID

在枚举类中:typedef enum MSFilterId,定义我们自己的音频及视频ID

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

编写对应的音视频设备

针对上面定义的 MS_H264Stream_CUS_ID , MS_H264_ENC_CUS_ID, MS_H264_DEC_CUS_ID 这几个filter,我们需要对应的加以实现!

用户自定义的filter,mediastreamer2里提供了相应的注册函数,这一部分代码不需要写到linphone里去,所以我们写在我们自己的应用APP中即可!

对针音频的:

音频设备上linphone里本身也有ALSA的实现,但我们自己使用了ALSA的混音配置,有一些差异,同时对音频数据在发送前需要做3A处理,消回声,去噪这些,
如果把这部分代码写到linphone中去就比较麻烦.为了方便,还是自己在应用中实现对音频的处理,同时很多ARM嵌入式主板,可能并没有提供ALSA接口的适配,
所以很多时候,还是自己实现一个MSSndCardDesc简单.

具体声明如下,各个方法的实现,只要看看mediastreamer2中的ALSA实现,简单对照实现即可!

	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;
	}
对针视频的:

因为视频是通过硬件的处理的,像RV1109,海思等方案都是调用硬编解码,所以不管是接收到视频流,还是发送视频流,
linphone只要负责收到或发送H264这样的流,并不负责编解码
所以这里需要把mediaStreamer2中的编解码及视频设备源处理一下。分别实现自己的编解码器及视频源设备!
具体的实现,就在各个方案上不同的! 基本定义如下!

	//定议两个并不需要的编解码器,这是应为我没有编译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;
	}

几个关健点的修改

视频处理的一个基本流:

linphone_core_update_streams->linphone_call_start_media_streams->linphone_call_start_video_stream->video_stream_start

linphone_call_start_video_stream 这个过程中有对视频源对像的更新(vstream)

创建VIDEO对应的filter及前后关系设置

videostream.c:video_stream_start
ms_filter_link

设备的的摄像头数据是已经经过编码成H264的数据了修改 video_stream_start 中的ms_filter_link配置从数据源直接指向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);
		}
	}

在这个文件中有好几处都需要对应的修改 ms_filter_link 关系,这里不一一列出了,都是在这个文件里了!

几个同音视频相关配置接口

同音视频相关的的几个接口,需要注意一下,因为在设置这几个参数后,会影响到音视频设备的开启关闭!

linphone_core_enable_video

视频接口配置,配置是否有摄像头及是否显示视频,通过这个配置后会设置video_conf的capture和display标识

linphone_call_enable_camera

设置是否开启摄像头

linphone_call_params_enable_early_media_sending

设置接听前是否有音视频发送文章来源地址https://www.toymoban.com/news/detail-732618.html

到了这里,关于Linphone3.5.2 ARM RV1109音视频对讲开发记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 音视频学习-音视频基础

    ` ◼ 像素:像素是一个图片的基本单位,pix是英语单词picture的简写,加上英语单词“元素element”,就得到了“pixel”,简称px,所以“像素”有“图像元素”之意。 ◼ 分辨率:是指图像的大小或尺寸。比如1920x1080。 ◼ 位深:是指在记录数字图像的颜色时,计算机实际上是用

    2024年02月12日
    浏览(109)
  • 【音视频】ffplay解析-音视频同步

    主要解析:以音频为基准,让视频同步音频 思路 视频慢了则丢掉部分视频帧(视觉-画⾯跳帧) 视频快了则继续渲染上⼀帧 具体实现 ffplay具体源码

    2024年02月07日
    浏览(49)
  • 音视频学习—音视频理论基础(2)

      音频是一种模拟信号,它是由声波转化而来的电信号。声波是通过气体、液体或固体传播的机械波,代表了声音的震动。在录制过程中,声音被转换成电信号,然后被储存在数字格式中。   声音的三要素是频率、振幅和波形   频率是指声波的振动次数,通常使用赫

    2024年04月29日
    浏览(41)
  • ffmpeg@音视频工具@音视频合并

    FFmpeg中文网 (github.net.cn) FFmpeg 是一款强大的开源跨平台音视频处理工具集,它包含了一系列命令行工具以及用于音频和视频编码解码、格式转换、抓取、流化等功能的库。FFmpeg 支持多种视频、音频格式和编解码器,能够进行音视频的压缩、封装、转码、分割、合并、过滤、抓

    2024年03月17日
    浏览(76)
  • 音视频 FFmpeg音视频处理流程

    推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月12日
    浏览(66)
  • 音视频 ffmpeg命令提取音视频数据

    保留封装格式 提取视频 提取音频 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(60)
  • linux 音视频架构 linux音视频开发

    转载 mob6454cc65110a 2023-07-26 22:27:01 文章标签 linux 音视频架构 ci QT 视频教程 文章分类 架构 后端开发 阅读数 117 目录 前言 1、软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件

    2024年02月07日
    浏览(72)
  • WebRTC音视频通话(二)简单音视频通话

    本篇不详细介绍websocket,只针对websocket整合rtc。 webrtc是P2P通信,也就是实际交流的 只有两个人 ,而要建立通信,这两个人需要 交换一些信息来保证通信安全 。而且, webrtc必须通过ssh加密 ,也就是使用https协议、wss协议。 借用一幅图 1.1 创建端点的解析 以下解析不包括we

    2023年04月09日
    浏览(58)
  • 抖音视频解析,无水印解析下载抖音视频

    抖音视频解析,你是否经常遇到这样的情况,看到一些非常精彩的抖音视频,想要保存下来,但因为下载速度慢或者视频带有水印而感到困扰?那么,这款(抖音无水印解析工具)将是你的得力助手!它可以轻松解决这些问题,使你能够更轻松、更便捷地批量解析和下载抖音

    2024年01月20日
    浏览(60)
  • LVGL - RV1109 LVGL UI刷新效率优化-02

    前面好早写过一个文章,说明如何把LVGL移到RV1109上的操作,使用DRM方式!但出现刷新效率不高的问题! 因为一直没有真正的应用在产品中,所以也就放下了! 最近开发上需要考虑低成本,低内存的方案,所以后续考虑使用LVGL上来做UI,所以这里捡回来再炒一次! 这里还是使

    2024年02月06日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包