转自我在简书上的笔记:https://www.jianshu.com/p/40f6b9002461
之前项目中各种视频播放出现问题,原因有好多,包括客户端播放器逻辑,Android系统播放器的坑爹bug,CDN,以及视频源的压缩处理不当等等。
然而,关于视频源压缩处理,我前段时间样衰衰,主动提出要搞一套自己服务器的转压工具,代替现有的视频制作部门使用的“狸窝”~(这个鬼听名字就知道low爆了)
Anyway,说做就做,进度一拖再拖,从提出到列入项目安排,过了一段时间,等服务器安排,又等了一段时间,其中的这些等待时间,我并没有太多地去研究细节,这点需要好好反省,不过关键技术点——压缩转码脚本,倒是很给力地向在某Y工作的初中同学要到了,在这里需要再次感谢老同学老麦~ 具体代码如下:
ffmpeg -y -i #输入文件路径# -profile:v baseline -level 3.0 -map_metadata -1 -c:a copy -b:a 48000 -ar 44100 -c:v libx264 -b:v #视频码率# -s #输出宽度#:#输出高度# -flags +loop -preset slower -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709:deblock=1,0 -vsync 0 -pix_fmt yuv420p -g 150 -keyint_min 25 -tune ssim -threads 4 -movflags +faststart #输出文件路径#
ffmpeg -y -i 6554b120ac7744d7a14bc0ad3890e310.mp4 -profile:v baseline -level 3.0 -map_metadata -1 -c:a copy -b:a 48000 -ar 44100 -c:v libx264 -b:v 240000 -s 854:480 -flags +loop -preset slower -x264opts colorprim=bt709:transfer=bt709:colormatrix=bt709:deblock=1,0 -vsync 0 -pix_fmt yuv420p -g 150 -keyint_min 25 -tune ssim -threads 4 -movflags +faststart 6554b120ac7744d7a14bc0ad3890e310-transcoded.mp4
核心功能有了,于是就开始做乞丐版,由于只是内部工具,连UI和产品设计都不需要,只需要让不会写代码的同事们可以无障碍地使用这个脚本工具即可。
视频转码压缩效果貌似还和电脑的芯片组有关(因为视频同事们曾经准备了一台电脑用来做压缩转码,然而系统一样,软件一样,弄出来的效果就不一样,居然会有声音画面不同步的情况发生)。于是,当然不写客户端啦,统一在服务器解决。这样,就会有一个需求,让用户能访问并操作服务器中的转码脚本。最直接的方案当然是Nginx + html css js + 后台接口 + ffmpeg了。
至于后台接口,可选择面非常广,nodejs,世界上最好的语言,java 等等等等,于是分工给了负责接口的那条hi佬说他java比较熟,于是就选择了java spring boot 微服务的方式,端口6969.
因为我们的主营项目也一直有版本迭代,所以这个项目就基本上穿擦在主营项目的版本之间的间隙中,加上那条hi佬经常“我都无做哦”。。。进度依然一拖再拖。。不过这只是我的吐槽。
于是最后完成接口,web端也完成,文件传输经过他们这里不行那里不行的讨论之后决定使用ftp。。。一切就绪,开始做整合测试。
nginx什么的都已经安装好了,但是,在调用第一个接口的时候我们发现。。同一个服务器不同端口 = 跨域!!
跨域情况表
很好,之前居然没想到,那么处理这个最简单快捷的方法是什么呢?当然是Nginx反向代理啦~
于是配置,reload,自信回头,然后,F♂? 404??
什么情况?于是开始排查,先看看这个重定向是不是能生效,事实证明,重定向到其他域名是能生效的,到我本机的apache也是可以的,但是到该服务器的localhost:6969就不行,这是为什么?? 不过不止localhost:6969不行,到我自己电脑的对应微服务也不行。肯定在这里出问题,进一步排查。
在这里中间插一个小插曲,就是使用这一台机器之前,DBA是分了另一台开发服给我用的,(为什么是DBA做IT的工作?不要在意这些细节啦~),同时,他的提议是用测试用的nginx服务器来做转发,使用dev域名访问。perfect!除了访问这个是用外网,传输文件慢成狗以外没什么缺点。。。等等,传输文件慢成翔那用个屁咧!于是才换成了我们现在正在使用的内网服务器方案,也省去了许多类似登录等安全性的开发。
当时的开发服和nginx弄好以后是能访问的,但是换成了现在只用一台服务器就不行了。看来是这边的nginx的问题。于是,开开nginx/error.log 一查看,13: Permission denied) while connecting to upstream 这句报错非常醒目,一查,原来是centos7的问题,只需要运行 setsebool -P httpd_can_network_connect 1 即可。 done! everything works fine now~
Reference:
https://stackoverflow.com/questions/23948527/13-permission-denied-while-connecting-to-upstreamnginx?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa