一:背景
资源注入流程是根据渠道运营商的规范接口,流程是将资源信息及媒体文件提交审核,注入到运营商或第三方的cdn.这个流程涉及到很多人工操作,比如运营整理媒资信息表格,资源格式转码,上传ftp注入,为提高效率,开发一个平台贯通整个流程.其中流程涉及到数据同步,资源转码,省份媒资下发,回调结果通知。
二:架构规划
其中需要关注的关键技术点:媒资转码方式,任务监控节点,渠道接入方案。
三:转码组件技术实现
背景:由于运营商对于上传cdn的资源都是有格式限制,以往都是由资源小伙伴使用media code线下转码,上传ftp备用。
1、调研: media code转码
media code调研
运营以前常用的线下windows上单机使用的转码工具,付费的产品。如果需要提供在linux上运行,或者提供接口服务,需要购买足够套数,和提供接口协议让media code方定制化研发。
2、调研:ffmpeg转码
实际上media code底层也是有依赖ffmpeg功能,考虑封装ffmpeg提供服务化组件,多台分布式部署,通过接口调用服务。
3、难点
调研没有成熟的api组件,主流的调用方式通过脚本命令调用安装好的ffmpeg程序,方案:规划组件封装转码服务。主要风险:第三方工具调用异常风险。
4、组件规划
(1)功能规划:
封装转码执行命令,组合转码主要参数;封装转码进程查询,提供产物情况查询;封装ftp上传功能,配合上传最终产物;封装本地文件删除功能,删除中间产物节约服务器空间。
(2)风险点:
①免费转码工具(转码输出成果需要符合cbr模式和关键帧提取);②第三方工具异常情况监控;③转码工具资源占用过大
5、组件研发流程
(1)三方工具
①ffmpeg封装格式流程:
解封装Demux ——> 解码Decode ——> 编码Encode ——> 封装Mux
封装格式转换并不进行视音频的编码和解码工作。而是直接将视音频压缩码流,从一种封装格式文件中获取出来,然后打包成另外一种封装格式的文件。
②转码格式:H264
MPEG-4 标准所定义的最新编码格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,经过有损压缩的,但在技术上尽可能做的降低存储体积下获得较好图像质量和低带宽图像快速传输。
③码流结构:
VCL:包括核心压缩引擎和块,宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码。
NAL:负责将VCL产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
VCL数据传输或者存储之前,会被映射到一个NALU中,H264数据包含一个个NALU,一个NALU = 一组对应于视频编码的NALU头部信息 + 一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload).
④转码模式:CBR(Constant Bit Rate)模式
事实上根本就没有CBR这种模式,我们可以通过补充ABR参数“模拟”一个恒定比特率设置, -bufsize是一个“码率控制缓冲区”,因此它会在每一个有用的定值的视频数据内强制一个你所要求的均值,所以基本上我们会认为接收端/终端播放器会缓冲那么多的数据,保证这个数据内部波动是没有问题的。
(2)最终转码命令
通过码率,模式等参数本地调试,通过Bitrate Viewer,mediaInfo等开源工具验证,确认转码结果符合转码模式和关键帧命令如下: /usr/bin/ffmpeg -i #{输入地址} -codec h264 -profile:v main -f mpegts -r 24 -g 24 -aspect #{高宽比} -b 5000k -maxrate 5000k -minrate 2000k -bufsize 1835k -s #{分辨率} -acodec mp2 -ab 192k -ar #{采样率} -y #{输出地址}符合需求
(3)封装转码参数
(4)转码流程
通过定时任务,默认启动6分钟,每间隔15分钟执行,查看正在运行任务,如果任务产品在15分钟内没有变化,关闭任务及正在运行的进程,回调结果。
(5)交互流程
6、难点功关:
(1)日志监控:①启动第三方任务时,java同步开启一个新线程,对免费工具日志解析,通过ffmpeg输出日志,发现(丢包、失败、参数不对),针对丢包,失败调用保活线程,重新执行1次,如果其他原因、定位问题,回调结果;
(2)流程可视化:转码每次运行到一个关键节点,都会回调资源平台通知当前进度。
(3)定时任务:监控生成最终产物大小,如果5分钟内,大小没变化。判定线程状态异常,终止任务,回调平台。
(4)针对转码工具资源占用过大,调研分布式方案:开发了基于netty方案的rpc中间件,制定服务端,客户端调用方式,通过client-server的方式,屏蔽客户端 网络操作,简化了客户端集成难度,提高开发效率。
(5)最大并行数限制:通过测试确认超过3条任务并行执行时,cpu占用100%,通过固定线程池核心数,最大数的方式限制单台服务最大并行转码任务数量(4条),保证服务稳定。
发现执行过程中,始终一个cpu被打满,通过cpu数量增量递减原则:转码命令增加配置-threads #{cpu数量/2} 优化增加cpu利用率。