在大数据时代,所有数据都值得被尊重,无论是文本数据,音频数据亦或是视频数据,特别是视频数据,最近短视频如抖音、快手的崛起,所以唤起了所有互联网从业者对数据处理的重新认识,而苹果公司针对移动设备等开发了一套基于http协议的流媒体解决方案,也就是HLS(HTTP Live Streaming),这个方案提供给客户端几乎实时的音视频流。这个就是就是将H264视频编码和aac音频编码的视频切片成非常小的片(TS)并且建立索引文件(m3u8),但是因为其只支持h264和aac编码,所以许多视频在切片前必须先进行转码操作,最后云转码切片管理平台也就应运而生了。

HLS(HTTP Live Streaming)

前文说到HLS技术基本原理是将视频文件或视频流切分成小片(ts)并建立索引文件(m3u8)。支持的视频流编码为H.264,音频流编码为AAC。

拿一个m3u8的文件举例:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:20
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.427100,
http://ffmpeg.moejj.com/videos/index0.ts
#EXTINF:10.427100,
http://ffmpeg.moejj.com/videos/index1.ts
#EXTINF:10.427100,
http://ffmpeg.moejj.com/videos/index2.ts
#EXTINF:10.427100,
http://ffmpeg.moejj.com/videos/index3.ts
#EXTINF:15.015033,
http://ffmpeg.moejj.com/videos/index4.ts
#EXTINF:8.008011,
http://ffmpeg.moejj.com/videos/index5.ts
#EXTINF:10.093433,
http://ffmpeg.moejj.com/videos/index6.ts
#EXTINF:8.717056,
http://ffmpeg.moejj.com/videos/index7.ts
#EXTINF:10.427100,
http://ffmpeg.moejj.com/videos/index8.ts
#EXTINF:6.965311,
http://ffmpeg.moejj.com/videos/index9.ts
#EXTINF:13.638644,
http://ffmpeg.moejj.com/videos/index10.ts
#EXTINF:11.678356,
http://ffmpeg.moejj.com/videos/index11.ts
#EXTINF:10.427100,
http://ffmpeg.moejj.com/videos/index12.ts

#EXTM3U:每个m3u8必须是以这个tag开头。
#EXTINF:指定每一个ts切片文件的持续时长。
#EXT-X-TARGETDURATION:指定最长的ts切片的持续时长,ts持续时长必须小于或者等于这个值。
#EXT-X-MEDIA-SEQUENCE:每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1, 一个media URI并不是必须要包含的,如果没有,默认为0。
#EXT-X-VERSION:指出playlist的兼容版本,比如这里EXTINF中持续时长是浮点数,这里就必须使用版本3,其他的兼容版本可以查询hsl文档。
由此m3u8的构成就简单介绍一遍。

转码的必要性

由于HLS技术的前提是h264视频编码和aac音频编码,所以如果想要实现在服务器上普遍的HLS技术,提供给移动设备极佳的播放体验,那么非h264视频编码格式和非aac音频编码格式的视频在切片前,事先进行转码就非常必要。再来因为h264视频编码是目前最适用的编码格式,因为其对视频的压缩率非常高,并且肉眼所见的质量衰减非常微小,目前是各大视频网站使用最多的编码格式。还有一个原因是如果一个视频没有字幕想要将一个字幕烧录进视频,那么也必须进行转码操作。由此看来转码是非常必要的功能。

ffmpeg

ffmpeg是一套目前世界上最流行的音视频处理工具,被视为音视频处理的神器,它具有超强的功能,包括不限于音视频转码、音视频合并剪辑、音视频流拆分、字幕拆分、视频截图、视频加水印、视频加字幕等功能。
其包括的有以下组件或工具:ffmpeg用于音视频转换核心工具、ffplay用于音视频播放、ffprobe用于获取音视频流信息、ffserver音频和视频的流媒体服务器。
转码主要利用的是ffmpeg工具,利用ffmpeg命令行进行转码十分方便快捷。
一句话转码成h264视频编码和aac音频编码格式:

ffmpeg -i input.mkv -c:v libx264 -c:a aac out.mp4

-c:v 指定使用视频编码,-c:a 指定使用音频编码,最后生成out.mp4文件,如此就可以很方便的将视频转码成h264视频编码和aac音频编码的mp4格式。
而现在需要的方案就是将ffmpeg工具嵌入到云转码切片管理平台工具中,捕获其转码切片的开始、错误、结束、过程等行为,并且存入数据库。

云转码express-ffmpeg

为了更好的管理ffmpeg转码切片的行为并且记录其过程,所以云转码express-ffmpeg应运而生,云转码基于nodejs开发,完全免费并且开源,实现了大文件切片上传、视频转码切片、烧录字幕、添加水印、分享链接防盗链等功能。

官网地址:云转码
源码地址:express-ffmpeg

云转码采用ffmpeg作为转码和切片的工具,实现了视频的高压缩率,多分辨率选择等功能,如果有兴趣可以前往官网查看,有详细介绍。

总结

借此所有关于hls和ffmpeg还有云转码切片管理平台的介绍就都结束了,但是在音视频处理的道路上我们还任重道远,比如如何做到视频上传完成及完成转码,如何搭建集群共同调度处理转码和切片?这些都是我们后面需要考虑的。