首页 > 其他分享 >FreeSWITCH实现在视频通话中某一方视频翻转

FreeSWITCH实现在视频通话中某一方视频翻转

时间:2023-05-10 14:00:29浏览次数:24  
标签:视频 rotate img member switch FreeSWITCH 翻转

客户项目使用浏览器+webrtc+FreeSWITCH在各类国产化终端间(windows+kylin+android+emss等)实现音视频通信、状态呈现以及即时消息。本来实施挺顺利,但客户新引进了一批新FT终端,摄像头画面竟然向左翻转了90度,关键是,客户认为终端质量没有问题,让软件系统自行解决。

翻遍了v4l2驱动配置和webrtc js说明都找不到相关办法,虽然浏览器中能让摄像头显示时翻转回来,但webrtc编码后仍旧是原来的样子,通信的对端看视频的时候别扭极了。。。

无奈,咱只对服务端的开发比较熟悉,只能在FreeSWITCH上修改了。

其实FreeSWITCH中内置了对视频翻转的基本方法,只是没有实现对特定通道的视频翻转,请看代码:

typedef enum {
SRM_NONE = 0, // No rotation.
SRM_90 = 90, // Rotate 90 degrees clockwise.
SRM_180 = 180, // Rotate 180 degrees.
SRM_270 = 270, // Rotate 270 degrees clockwise.
} switch_image_rotation_mode_t;
SWITCH_DECLARE(void) switch_img_rotate(switch_image_t **img, switch_image_rotation_mode_t mode);
SWITCH_DECLARE(void) switch_img_rotate_copy(switch_image_t *img, switch_image_t **new_img, switch_image_rotation_mode_t mode);
会议模块也实现了对会议中特定成员的翻转、镜像控制:

if (conference_utils_member_test_flag(member, MFLAG_FLIP_VIDEO) ||
conference_utils_member_test_flag(member, MFLAG_ROTATE_VIDEO) || conference_utils_member_test_flag(member, MFLAG_MIRROR_VIDEO)) {
if (conference_utils_member_test_flag(member, MFLAG_ROTATE_VIDEO)) {
if (member->flip_count++ > (int)(member->conference->video_fps.fps / 2)) {
member->flip += 90;
if (member->flip > 270) {
member->flip = 0;
}
member->flip_count = 0;
}

switch_img_rotate_copy(frame->img, &img_copy, member->flip);
} else if (conference_utils_member_test_flag(member, MFLAG_MIRROR_VIDEO)) {
switch_img_mirror(frame->img, &img_copy);
} else {
switch_img_rotate_copy(frame->img, &img_copy, member->flip);
}
}
有了这个基础,我们就可以针对特定的终端进行翻转控制了:

1、修改用户配置

以用户1000为例,修改conf/directory/default/1000.xml,增加如下行,表示我们要对该用户发出的视频向右翻转90度:

<variable name="read_video_rotate" value="90"/>
2、在core session解析codec settings时增加下述代码:

if ((rotate = switch_channel_get_variable(session->channel, "read_video_rotate"))) {
switch_channel_set_flag_recursive(session->channel, CF_VIDEO_DECODED_READ);
engine->codec_settings.video.rotate = atoi(rotate);
}
CF_VIDEO_DECODED_READ是个什么鬼呢?它的用途其实是,对用户的视频强制解码,为啥要解码?为了翻转呀,不解码怎么翻转。

3、执行翻转,在avcodec中增加下述代码:

if(context->codec_settings.video.rotate > 0){
switch_img_rotate(&(context->img),(switch_image_rotation_mode_t)context->codec_settings.video.rotate);
}
上述代码的逻辑,应该是无懈可击的,但有一个小小的遗憾,因为要解码、翻转,需要将FreeSWITCH置为全媒体模式,即在sip internal中将inbound-bypass-meida inbound-proxy-mdia关闭

<!--Uncomment to set all inbound calls to no media mode-->
<!-- <param name="inbound-bypass-media" value="true"/> -->

<!--Uncomment to set all inbound calls to proxy media mode-->
<!-- <param name="inbound-proxy-media" value="true"/> -->
但这样的设置给FreeSWITCH带来了极大的性能风险,因为这样一来,所有媒体都要经过FreeSWITCH,而且媒体还可能重新编解码。

有没有更好的方式解决这个问题呢,答案是有,我们可以关闭全媒体模式,在dialplan中仅针对这一批终端打开全媒体模式,首先在你的用户配置lua脚本(或写一个新的lua脚本)中增加下述代码:

session:setAutoHangup(false);
local read_video_rotate = session:getVariable("read_video_rotate");
if(read_video_rotate ~= nil) then
session:execute("media_reset");
end
然后在dialplan中引用此脚本:

<action application="lua" data="xxxx.lua"/>
好了,至此问题完美解决,仅当在特定用户配置中设置了read_video_rotate的用户,FreeSWITCH才将其呼叫设置为全媒体模式,进行解码、翻转、编码并发给对端,兼顾了FreeSWITCH的性能和功能。

标签:视频,rotate,img,member,switch,FreeSWITCH,翻转
From: https://www.cnblogs.com/kn-zheng/p/17387779.html

相关文章

  • freeSWITCH 视频通话
    一,freeSWITCH安装  本实验基于CentOS6 源码编译安装FreeSWITCH,详细安装过程见下:http://990487026.blog.51cto.com/10133282/1921010   二,配置FreeSWITCH,加载H26x模块1,FreeSWITCH先处于关闭状态.2,修改配置文件:[root@CentOS ~]# vim ~/freeswitch/etc/fr......
  • 浅析AI视频智能识别技术如何助力智慧平安校园建设
    校园安全一直是学生健康成长、全面发展的前提与保障。校园门口伤害事件的频发与校园内应急事件的突发,让建设平安校园的任务愈加急迫。校园人流量大、监控点多,安保人员无法同时盯住上百个视频画面,亦无法保证24小时有效监控。传统的校园安防消耗大量人力,事故处置效率非常低,安全预警......
  • EasyPlayer播放H.265视频,播放器快照时间显示的问题优化
    我们的EasyPlayer流媒体播放器可支持H.264与H.265,能支持RTSP、RTMP、HLS、FLV、WebRTC等格式的视频流播放。TSINGSEE的视频平台均集成了EasyPlayer的播放器,实现了无插件网页直播,性能稳定。有用户反馈,EasyPlayer在播放H.265视频的通道时,播放器快照时间显示的是时间戳,并不是日期。......
  • 提高利润、节约成本:为什么光伏电站必须采用视频监控技术?
    ​随着光伏电站在世界各地的迅速普及,对光伏电站的安全管理和效率管理要求也日益提高。为了监控和保护大型光伏电站的设备和设施安全,同时实现远程能源管理和实时监控,采用视频监控技术已成为一种有效的解决方案。本文将介绍光伏电站视频监控应用,使用SG500工业网关作为网络数据传输。......
  • Qt音视频开发45-音视频类结构体参数的设计
    一、前言视频监控内核组件重构和完善花了一年多时间,整个组件个人认为设计的最好的部分就是各种结构体参数的设计,而且分门别类,有枚举值,也有窗体相关的结构体参数,解码相关的结构体参数,同时将部分常用的结构体参数的获取和设置单独提供了函数,参阅海康大华等大厂的sdk的设计方式,也是......
  • 【小小Demo】网页视频通话
    工程名video-call一个简单的音视频通话demo,包含:视频、麦克风、屏幕共享操作。项目环境jdk1.8ideamavenspringboot2.1.1.RELEASEwebsocketthymeleaf项目启动修改maven设置打开IDEA设置:File>Setting>Build,Exec...如下图所示启动找到启动类,鼠标右键点击三角......
  • 【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数
    全文链接:http://tecdat.cn/?p=9706最近我们被客户要求撰写关于非线性模型的研究报告,包括一些图形和统计输出。在这文中,我将介绍非线性回归的基础知识。非线性回归是一种对因变量和一组自变量之间的非线性关系进行建模的方法。最后我们用R语言非线性模型预测个人工资数据是否每年......
  • 【视频】时间序列分类方法:动态时间规整算法DTW和R语言实现|附代码数据
    原文链接:http://tecdat.cn/?p=22945最近我们被客户要求撰写关于动态时间规整算法的研究报告,包括一些图形和统计输出动态时间扭曲算法何时、如何以及为什么可以有力地取代常见的欧几里得距离,以更好地对时间序列数据进行分类时间序列分类的动态时间扭曲使用机器学习算法对时间序......
  • 阿里云部署freeswitch的公网ip问题,nat穿越问题
    关于阿里云安装freeswitch的内容请参见本人另一篇博文。ubuntu14.04lts安装freeswitch这里把困扰本人很久的问题,阿里云使用“专有网络”后,系统获取公网ip错误,导致freeswitch无法连接及打通电话的问题解决方法记录一下:1、在var.xml中修改<!--X-PRE-PROCESScmd="stun-set"dat......
  • ubuntu14.04 lts 安装freeswitch
    ubuntu14.04lts安装freeswitch:0、安装一堆依赖包。apt-getinstalllibedit-devlibldns-devlibpcre3-devlibspeexdsp-devlibspeex-devlibcurl4-openssl-devlibopus-devlibncurses5-devlibtiff-devlibjpeg-devzlib1g-devlibssl-devlibsqlite3-devbuild-essential......