HEXA娱乐开发日志技术点005——死而复生之Gstreamer推流

HEXA开发日志目录
上一篇 HEXA娱乐开发日志技术点004——一步到位的推流


前言

距离上一次发文快4周了,不过我没有偷懒,技术上确实遇到了点困难,反正情况变成了下面这样,讲完干货再说。

这些折腾充分体现了技术视野对开发的重要性。

技术需求与技术点

干货

很遗憾,上次的工作成果又被暂时抛弃了,这次我用Gstreamer
一切原因后面再解释,先说说搞出了啥咋搞的为啥这么搞

搞出了啥

成功使用Gstreamer实现了推流,从网页上看的性能,fps16左右,分辨率320x200,h264编码,虽然参数惨不忍赌,但也比之前的fps不到4强了。目前还没有整合到skill里面,只是用binary执行文件测试,源码在github上。

咋搞的

  1. 登陆机器人
  2. 挂载优盘(优盘里有gst-plugins-good的git库)
  3. 编译+安装gst-plugins-good
  4. 替换机器人身上的v4l2 gstreamer插件
  5. 编译我写的测试程序,生成binary执行文件simple
  6. 执行./simple <你的rtmp url>

为啥这么搞

下面逐条解释一下上面步骤

  • 登陆机器人
    我之前好像提到过进到机器人身体里之类的动作,指的就是这个。操作方法是在手机APP上的Skill商店里打开高级开发模式,同时会看到ssh登陆命令,登陆后别忘了用passwd命令改一下初始密码。一般终端都支持ssh,都可以直接登陆。
ssh root@<机器人IP地址>
  • 挂载优盘
    挂载优盘的原因是,机器人身上的空间不够大,后面的编译动作会占空间。如果不出意外,并且优盘是FAT32文件系统的话,挂载命令就是下面这个,然后/mnt/sda1就等同优盘的根目录了。
mkdir /mnt/sda1
mount -t vfat dev/sda1 /mnt/sda1
  • 编译+安装gst-plugins-good并替换机器人身上的v4l2 gstreamer插件
    为啥要自己编译这个东西呢?因为不弄的话,gstreamer程序会陷入死循环,为啥死循环呢,因为这机器人的kernel的v4l2驱动没有按照官方标准实现,或者这版本的kernel这块就是有问题的。他们这kernel不开源,我就只好从用户层想办法,所以就改了gst-plugins-good里面的v4l2相关代码。
    编译不麻烦,只是有几个坑。
    执行./autogen.sh就会发现,有依赖的系统库没有装,缺啥装啥就行了,用apt命令解决,先执行apt search <缺少库的名字>找到缺少库的完整名字,然后apt install <缺少库的完整名字>就行了。
    最后卡住的是gstreamer的版本问题,要把gst-plugins-good切换到tag1.2.0才能通过,生成Makefile,当然,这之前要apt install git装一下git,或者在别处切好tag。
    在编译和安装完成后再替换一下系统原来的v4l2 gstreamer库就可以了。
    这小节全部过程和命令如下
cd /mnt/sda1/gst-plugins-good
git checkout tags/1.2.0
git submodule init
git submodule update
./autogen.sh
报错,形如fail...need ...xxx
apt search xxx
找到形如xxx-yyy
apt install xxx-yyy
./autogen.sh
再次执行,没有报错
make
make install
mv /usr/local/lib/gstreamer-1.0/libgstvideo4linux2.so /usr/lib/arm-linux-gnueabihf/gstreamer-1.0/libgstvideo4linux2.so

这之后可以考虑make uninstall卸掉它,因为需要的库已经换完了,也没必要占用空间。

疑似kernel的问题

有兴趣的小伙伴可以去了解一下这个版本官方的的v4l2的VIDIOC_ENUMSTD ioctl返回值是不是有问题。机器人的kernel版本是下面这样的

uname -a
Linux hexa 3.10.17_1.0.0_mb9000+ #35 SMP PREEMPT Thu Jan 18 07:08:48 UTC 2018 armv7l armv7l armv7l GNU/Linux

  • 我写的测试程序
    关于这个步骤没什么好解释的,一个make,然后执行以下看看Usage就搞定。更需要说明的是为什么改用Gstreamer,至于这个程序大概怎么写出来的,看Gstreamer的官方英文文档是最好的,下面来讲讲为什么改用Gstreamer。

解惑

为什么改用Gstreamer

因为官方推荐
故事是这样的,在上次的总结中有这样一个问题:

下位机推流还有点问题,可以在播放端看到,似乎是推流的速度不够,出现了视频网站那种放一会儿就要缓冲一下的现象,具体原因有待分析

我针对这个问题研究了一番,发现官方的GO语言接口获取一张图像的时间是200多毫秒,大概是每秒4帧不到的样子,后来我看到官方论坛上有提到用v4l2驱动直接访问/dev/video0设备文件的方式,我试了发现,1280x720的图就是每张200多毫秒,然后我向官方咨询,就被安利了Gstreamer和他们集成到机器人身上的一个VPU硬件编码模块和基于它的Gstreamer插件。

这之后我就开始在Gstreamer和ffmpeg之间徘徊不前。

  • 一方面是因为我想不到还有什么比直接调用ioctl更直接的东西来获得摄像头的实际性能,这一方面在我偶然用网上的一个测试摄像头的程序测试时发现了问题。这问题就是我一直测试的是1280x720尺寸的帧率,我在论坛上没提到过我用的什么尺寸,结果我改成640x480后,就可以达到25帧了。我这一点结论还没有得到官方的回复。
  • 另一方面因为搜索Gstreamer获得的中文信息弄得我一头雾水,越看越懵,所以还是想要延续原来的方案,想把官方安利的硬件编码模块搞成ffmpeg的一个编码器,或者至少在较上层把他们对接起来,但是动起手来还是感觉很麻烦。最后下定决心,开始看Gstreamer的官方英文文档,这下头上的雾水没了,一路搞下来才有今天这篇文章。

有趣的事

如果你不搞嵌入式,也许不会发现这件事很特别,那就是我的编译是在机器人上完成的。经典的嵌入式开发套路是这样的

上位机编译,下位机运行

这个机器人违反了这个套路,它身上的开发环境一应俱全,只要不嫌编译慢,它就既是上位机,又是下位机。


另一件有趣的事情是,机器人被我搞死一次。
那天我是把gstreamer工程(为啥编译它?在这文章背后,我走的弯路多了。有人能岁月静好,是因为有人在背后负重前行)放到机器人身上(不在优盘里)编译,结果空间不够了,我就删了点东西,因为它总是报告/tmp目录下创建东西不成功,我就把下面东西删了,然后把优盘挂载到了/tmp,结果第二天我再开机就起不来了。后来我找到了说明书上重置的方法,要用6根线,把机器人背上的管脚按照说明书接一下,最后我到公司找了6根线把它救活了。
在清空/tmp时,下面有一个套接字文件,我比较怀疑是删了它导致了机器人的死亡,但是我暂时不想验证这个结论。

srwxr-xr-x  1 root root      0 May  8  2017 wpa_ctrl_698=

总结

  • 用Gstreamer实现了推流,暂时抛弃了ffmpeg
  • 发现机器人可以同时做上/下位机
  • 搞死一次机器人,重置救活
  • 音频先不管,它不自带话筒,一般的话筒它不能用,还得专门买,这事后面再研究吧
  • 目前推流的性能不是很好,不过先暂且如此吧,可以先整合进skill,然后研究一下怎么对视频做图像处理吧
  • 这些事情的草还没发芽,包括弹幕命令集、机器人命名等
  • 也许会写一篇关于Gstreamer的文章吧

下一篇 HEXA娱乐开发日志技术点006——日拱一卒拱歪了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容