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};//在一个合适的地方注册filterms_filter_register(&ms_h264_dec_cus_desc);ms_filter_register(&ms_h264_enc_desc);//定义真正传输H264视频的FilterMSFilterDesc 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};//初始化注册filterbool 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

设置接听前是否有音视频发送

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/85562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python线程和进程

1、深度解析Python线程和进程 一篇文章带你深度解析Python线程和进程 - 知乎使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计。如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮…

stm32之看门狗

STM32 有两个看门狗,独立看门狗和窗口看门狗,独立看门狗又称宠物狗,窗 口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是当计数器达到给定的超时值时,产生系统复位,对于窗口型看门狗同…

FL Studio21.2中文版数字音乐制作软件

现在的FL也可以像splice一样啦,需要什么样的声音只需在fl里搜索,就会自动展示给你! FL Studio 简称FL,全称:Fruity Loops Studio,国人习惯叫它"水果"。软件现有版本是 FL Studio 21,已全面升级支…

如何利用播放器节省20%点播成本

点播成本节省的点其实涉及诸多部分,例如:CDN、转码、存储等,而利用播放器降本却是很多客户比较陌生的部分。火山引擎基于内部支撑抖音集团相关业务的实践,播放器恰恰是成本优化中最重要和最为依赖的部分。 火山引擎的视频团队做了…

“智慧”北京,人工智能引领“新风尚”

原创 | 文 BFT机器人 北京时间,9月15日,北京人工智能产业峰会暨中关村科学城科创大赛颁奖典礼在北京中关村举行,同时惠阳还举行了“中关村人工智能大模型产业集聚区”启动建设的揭牌仪式。 此次大会围绕北京AI产业的建设与发展,各…

大模型时代,探人工智能发展的新动向

导语 | 今年以来大模型的热度居高不下,人工智能成为国内外各大厂商争相布局的新赛道。那么近期 AI 领域有哪些值得关注的新趋势,它又将为软件开发带来哪些影响呢?今天,我们特邀了微智云科技 CEO、腾讯云 TVP 张虎老师,…

不用addEventListener(‘resize‘, this.resize),用新的Web API ResizeObserver监听DIV元素尺寸的变化

响应式设计指的是根据屏幕视口尺寸的不同,对 Web 页面的布局、外观进行调整,以便更加有效地进行信息的展示。我们日常生活中接触的很多应用都遵循响应式的设计。 响应式设计如今也成为 web 应用的基本需求,而现在很多 web 应用都已经组件化&a…

分布式运用之Filebeat+Kafka+ELK 的服务部署

一、Kafka 架构深入了解 1.1 Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic 的。 topic 是逻辑上的概念,而 partition 是物理上的概念,每个 par…

LinkedList相较于Arravlist的特点/优化

Arravlist底层是内存空间连续的数组,可以根据下标进行随机访问,效率比较高,因为在根据下标访问某一个元素时,并不是一个一个去查,而是算出来这个下标的地址,直接根据这个地址的指向去获取的,因为…

Linux 创建 终止线程(thread)

进程线程区别 创建线程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); -功能&#xff1a;创建一个子线程&#xff0c;一般情况下main函数所在的线程称为主线程&#xff0c;…

Unity的AB包相关

1、打包 在这个界面左边右键&#xff0c;CreateNewBundle 将要打包的模型制作成预设体 在下面勾选 选好平台路径&#xff0c;点击Build 2、加载AB包 public class ABTest : MonoBehaviour {// Start is called before the first frame updatevoid Start(){//加载AB包AssetB…

mysql集群使用nginx配置负载均衡

参考链接&#xff1a;https://mu-sl.com//archives/mysql%E9%9B%86%E7%BE%A4%E4%BD%BF%E7%94%A8nginx%E9%85%8D%E7%BD%AE%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1 配置文件nginx_tcp.conf 示例 load_module modules/ngx_stream_module.so;stream{upstream tcpssh{hash $remote_…

【c#-Nuget 包“在此源中不可用”】 Nuget package “Not available in this source“

标题c#-Nuget 包“在此源中不可用”…但 VS 仍然知道它吗&#xff1f; (c# - Nuget package “Not available in this source”… but VS still knows about it?) 背景&#xff1a; 今日从公司svn 上拉取很久很久以前的代码&#xff0c;拉取下来200报错&#xff0c;进一步发…

如何设置代理ip服务器地址

在今天的互联网环境中&#xff0c;代理服务器在保护个人隐私和规避网络限制方面扮演着重要的角色。设置代理服务器地址的方式主要取决于你使用的具体软件或编程语言。在本文中&#xff0c;我们将分别介绍如何在Python和Java中使用HTTP代理服务器、SOCKS代理服务器以及代理池。 …

十六、垃圾回收相关概念

目录 一、System.gc()的理解二、内存溢出和内存泄漏2、内存泄漏 三、Stop the World1、什么是 stop the word ? 四、垃圾回收的并行和并发1、并发和并发2、垃圾回收的并行和并发 五、安全点与安全区域1、什么是安全点&#xff1f;2、安全区域 六、强引用&#xff08;不可回收&…

linux lsof命令操作汇总

备忘记录&#xff0c;持续扩充... lsof(list open files)是一个列出当前系统打开文件的工具&#xff0c;功能非常强大。lsof 需要访问核心内存和各种文件&#xff0c;所以必须以 root 用户的身份运行才能够充分发挥其功能。 目录 参数说明 1、显示指定用户的进程&#xff08…

C/C++开发,opencv阀值操作

目录 一、OpenCV-阀值操作 1.1阀值操作函数threshold 1.2threshold的操作类型 1.3Otsu算法 二、样例开发 2.1 Makefile 2.2 main.cpp 2.3 运行效果 三、OpenCV-自适应阀值操作 3.1 自适应阀值操作函数-adaptiveThreshold 3.2 样例开发 一、OpenCV-阀值操作 1.1阀值操…

制作游戏demo的心得

制作这个游戏demo出来的心得 https://www.bilibili.com/video/BV1cF411m7Dh/ 制作游戏demo的心得 制作游戏demo&#xff0c;主要是为了表现自己的技术&#xff0c;那就一门心思想着如何提高表现力就行了&#xff0c;在整体的画面渲染风格方面或许没有什么可选择的&#xff0c;…

Python与数据分析--Matplotlib-1

目录 1.Matplotlib库函数导入 2.简单尝试绘图 3.绘制多条折线图 4.绘制多种颜色风格曲线 5.图片内容文本操作实例 6.图例设置实例 7.坐标轴设置实例 1.Matplotlib库函数导入 #导入matplotlib库 import matplotlib as mpl import matplotlib.pyplot as plt #平常一般用第…

Java实现Modbus Tcp协议读写模拟工具数据

标题 前言一、读写模拟工具中数据(1) 定义Controller层(2) 定义Service层实现 二、调试(1) 读数据(2) 向寄存器写单个数据(3) 向寄存器写多个数据 前言 参考文章&#xff1a;https://www.cnblogs.com/ioufev/p/10831289.html 该文中谈及常见的几种读取设备数据实现&#xff0…