视频点播解决方案HLS(2)之视频编码概述及FFmpeg的基本使用

视频点播解决方案HLS(2)之视频编码概述及FFmpeg的基本使用

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

视频编码概述

所谓视频编码方式就是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。视频流传输中最为重要的编解码标准有国际电联的 H.261、H.263、H.264,运动静止图像专家组的 M-JPEG 和国际标准化组织运动图像专家组的 MPEG 系列标准,此外在互联网上被广泛应用的还有 Real-Networks 的 RealVideo、微软公司的 WMV 以及 Apple 公司的 QuickTime 等。

首先我们要分清文件格式和编码格式:

  • 文件格式:是指 .mp4、.avi、.rmvb 等这些不同扩展名的视频文件的文件格式,视频文件的内容主要包括视频和音频,文件格式是按照一定的编码格式去编码,并且按照该文件所规定的封装格式将视频、音频、字幕等信息封装在一起,播放器会根据它们的封装格式去提取出编码,然后由播放器解码,最终播放音视频。
  • 音视频编码格式:通过音视频的压缩技术,将视频格式转换成另一种视频格式,通过视频编码实现流媒体的传输。比如:一个 .avi 的视频文件原来的编码是 a ,通过编码后编码格式变为 b ,音频原来为 c ,通过编码后变为 d。

音视频编码格式种类繁多,主要有几下几类:

  • MPEG系列
    由ISO(国际标准组织机构)下属的 MPEG(运动图象专家组)开发,视频编码主要包括有 Mpeg1(vcd 用的就是它)、Mpeg2(DVD使用)、Mpeg4(DVDRip 使用的都是它的变种,如:divx , xvid 等)、Mpeg4 AVC (正热门) ; 音频编码主要包括有 MPEG Audio Layer 1/2、MPEG Audio Layer 3(大名鼎鼎的 mp3)、MPEG-2AAC、MPEG-4AAC 等等。注意:DVD 音频没有采用 Mpeg 的。
  • H.26X系列
    由 ITU(国际电传视讯联盟)主导,侧重网络传输(注意只是视频编码),包括 H.261、H.262、H.263、H.263+、H.263++、H.264(就是 MPEG4 AVC 合作的结晶)。

目前最常用的编码标准是视频 H.264,音频 AAC。

FFmpeg的基本使用

介绍

我们将视频录制完成后,需使用视频编码软件对视频进行编码,FFmpeg 就是一款可用于视频编码的软件。
FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用 LGPL 或 GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库 libavcodec,为了保证高可移植性和编解码质量,libavcodec 里很多 code 都是从头开发的。
FFmpeg 在 Linux 平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括 Windows、Mac OS X 等。这个项目最早由 Fabrice Bellard 发起,2004 年至 2015 年间由 Michael Niedermayer 主要负责维护。许多 FFmpeg 的开发人员都来自 MPlayer 项目,而且当前FFmpeg 也是放在 MPlayer 项目组的服务器上。项目的名称来自 MPEG 视频编码标准,前面的“FF”代表“Fast Forward”。
FFmpeg 被许多知名软件采用,如 QQ 影音、暴风影音、VLC 等。

官方下载地址:http://ffmpeg.org/download.html
百度网盘地址(包括测试文件):https://pan.baidu.com/s/1A5KyBu-pR9lK3kc-VM_K1Q

编码格式转换

以将提供的 avi 格式的视频文件转编码为 mp4 格式的文件为例,执行下面命令即可:

ffmpeg -i ./lucene.avi lucene.mp4

执行完毕后会发现原视频文件下生成了它的 mp4 格式的视频文件。
不仅如此,它还支持 mp3、gif 等格式的转换,依旧是使用上面命令,修改要转换的文件格式后缀即可。

视频文件切块

下面将使用 ffmpeg 将视频文件切割为多个 ts 文件和一个 m3u8 索引文件。

第一步:先将avi视频转换为mp4格式

其实可以直接将 avi 视频进行切块,但是实际经验得出的结论是先转为 mp4 格式再切块效果会好一些。

执行下面命令将 avi 格式文件转换为 mp4 格式:

ffmpeg -i ./lucene.avi -c:V libx264 -s 1280x720 -pix_fmt yuv420p -b:a 63k -b:v 753k -r 18 lucene.mp4

各参数的配置是针对当前要转换的视频来设定的,具体设定方案这里就不多说。

下面简单了解一下上面参数的含义:

  • -c:v:视频编码为 x264,x264 编码是 H264 的一种开源编码格式;
  • -s:设置分辨率;
  • -pix_fmt yuv420p:设置像素采样方式,主流的采样方式有三种:YUV4:4:4、YUV4:2:2 和 YUV4:2:0,它的作用是根据采样方式从码流中还原每个像素点的 YUV(亮度信息与色彩信息)值;
  • -b:设置码率,-b:a-b:v 分别表示音频的码率和视频的码率,-b 表示音频加视频的总码率。码率对一个视频的质量有很大的作用;
  • -r:帧率,表示每秒更新图像画面的次数,通常大于 24 肉眼就感受不到停顿了;

码率的设置:
码率又叫比特率即每秒传输的 bit 数,单位为 bps(Bit Per Second),码率越大传输数据的速度越快。
码率的计算公式是:

文件大小(转成 bit)/ 时长(秒)/ 1024 = kbps(即每秒传输千位数)。

例如一个 1M 的视频,它的市场是 10s,那么它的码率就为:

1*1024*1024*8/10/1024 = 819kbps

码率设置到多少才能达到最好状态,可参考一些视频网站,下面是优酷对码率的要求:
image.png

第二步:将mp4文件切块生成m3u8和ts文件

ffmpeg -i lucene.mp4 -hls_time 10 -hls_list_size 0 -hls_segment_filename ./hls/lucene_%05d.ts ./hls/lucene.m3u8

参数说明:

  • -hls_time:设置每片的长度,单位为秒;
  • -hls_list_size n:保存的分片数量,设置为 0 表示保存所有分片;
  • -hls_segment_filename:段文件的名称,%05d 表示 5 位数字;

执行完毕后生成如下文件:

image.png

接下来可以使用 VLC 来打开 m3u8 文件了,VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数媒体文件,以及 DVD、音频 CD、VCD、及各类流媒体协议。(http://www.videolan.org/)。

我这里使用 mpv 播放器也能正常打开浏览。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/hls2.html

Buy me a cup of coffee ☕.