客户项目使用浏览器+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) thensession:execute("media_reset");
end

然后在dialplan中引用此脚本:

<action application="lua" data="xxxx.lua"/>

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

FreeSWITCH实现在视频通话中某一方视频翻转相关推荐

  1. 手游中实时音视频的开发经验与实现技巧

    在由 Cocos 携手声网举办的 Cocos 开发者者巡回活动中,声网解决方案架构师李亚分享了手游中实时音视频的开发实践经验与技巧. 以下为李亚的演讲纪实: 在游戏社会化趋势的影响下,实时音视频逐渐广 ...

  2. 声网 VQA:将实时互动中未知的视频画质用户主观体验变可知

    在实时互动场景中,视频画质是影响观众体验的关键指标,但如何实时评价视频的画质一直是个行业难题,需要将未知的视频画质用户主观体验变成可知. 未知的部分往往是最需要攻克的,声网也一直在持续探索符合实时互动 ...

  3. WebRTC视频通话中最多能容纳多少用户?

    作者 / Tsahi Levent-Levi 翻译 / 小极狗 只要你想,在WebRTC视频通话中添加从一到一百万的用户都是可以的. 当被要求创建一个群组视频通话时,显然,针对该项目应该选择WebRT ...

  4. vue2项目中如何接入视频监控

    前言 想必各位作为开发者的程序员,有时候公司会给你安排在项目中实现视频实时监控 视频实时监控功能,在很多领域都广泛应用,能帮我们在各行各业都解决很多事情,像智慧工地中AI识别(安全帽.在离岗等).国标 ...

  5. win10html5无法播放,win10系统中网页中无法播放视频怎么办

    近日有win10系统用户要通过浏览器来打开网页观看视频的时候,却发现在网页中打开视频的时却无法播放,这是怎么回事呢,经过分析是由于Adobe Flash Player ActiveX插件未安装.版本过 ...

  6. 有的放矢,远程操控中实时音视频的优化之道

    5G远程操控场景,对实时音视频传输的时延.卡顿率和抗弱网等指标都有着非常高的要求,本文将会介绍如何结合5G网络特点,在实时音视频通信链路中进行联合优化,满足行业场景远控需求,降低画面时延. 在上一篇文 ...

  7. 在FCKeditor 2.6中添加插入视频和音频功能

    2019独角兽企业重金招聘Python工程师标准>>> 本文转载 在FCKeditor 2.6中添加插入视频和音频功能 这里有两种方式,一是自己修改,二是使用插件 1.自己修改 FC ...

  8. WebRTC 中收集音视频编解码能力

    在 WebRTC 中,交互的两端在建立连接过程中,需要通过 ICE 协议,交换各自的音视频编解码能力,如编解码器和编解码器的一些参数配置,并协商出一组配置和参数,用于后续的音视频传输过程. 对于音频, ...

  9. 腾讯视频中如何把视频进行收藏

    在线观看视频的时候,把喜欢的视频收藏下来,可以方便以后再看.腾讯视频如何进行收藏呢? 腾讯下载视频怎么转格式_腾讯视频中如何把视频进行收藏 1.找到桌面上的快捷方式,双击打开程序 腾讯下载视频怎么转格 ...

  10. Android 扫描SD卡中的所有视频文件

    Android应该是已经把所有的视频文件音频都在开机时,扫描完毕然后存在本地SQLite数据库了,因此,我们"扫描"的最简单方法是读取这个已经存储好的数据库.但是这样做,在程序开启 ...

最新文章

  1. 贝叶斯岭回归(BayesianRidge)、自动关联决策回归、高斯过程、核函数、及高斯回归、高斯过程分类
  2. Django数据库的查看、删除,创建多张表并建立表之间关系
  3. Git 初始化及仓库创建及操作
  4. 程序人生:程序员成熟的标志
  5. 好用的shell工具_精选5个酷毙的Python工具
  6. numpy.arange语法,作用以及举例
  7. C++ 容器适配器priority_queue的使用及实现
  8. 源头防堵信息泄露 监管拟全面推行支付标记化
  9. Java8 Stream 流使用场景和常用操作
  10. CSS 颜色代码大全
  11. c# 用SqlParameter实现多字段模糊查询
  12. deepin linux 怎么安装软件,deepinLinux系统安装及软件安装
  13. 计算机图形学-二维图形的裁剪
  14. 【python】身份证识别
  15. C#卸载程序需要密码/防卸载功能
  16. 树莓派4+lede+移远5G模组RM500Q
  17. c语言中的less函数,less的使用-基本语法-编译
  18. (附源码)计算机毕业设计ssm个人人际关系管理软件
  19. 如何退出Dos——附DOS命令大全
  20. python处理输入无效数据异常_python异常的处理

热门文章

  1. 计算机考研自学,自学考研计算机
  2. FFmpeg安卓流媒体播放器开发实战视频课程 -基于NDK、C++和 FFmpeg Android
  3. 反射之前奏Oracle简单版
  4. 关于可见光摄像机与机器视觉的科普
  5. CGROUP CFS 调度中的 period,burst 概念
  6. android指纹采集sdk,SDK上的Android指纹23
  7. unity 接入谷歌广告
  8. 处理不连续单元格,如sum,sumif,countif
  9. 找不到系统指定路径的解决思路
  10. Python学习:使用pycharm运行py文件报错系统找不到指定的路径