Nginx 搭建DASH服务器

Nginx 搭建DASH服务器

Nginx 搭建DASH服务器_第1张图片
(图1.players.akamai)

好久没有写博客了,新年这几天也一直荒废,最近开始准备毕业设计,需要用到DASH来做动态码率传输。至于什么是DASH,这里不再赘述,可以参考Dash相关领域知识总结,再给一个DASH播放器akamai,方便大家直观地感受下DASH。本文要分享的内容为搭建一个自己的DASH服务器,内容比较简单,主要涉及一些工具的使用。


使用FFMpeg获得不同分辨率视频

首先是ffmpeg的安装,可以参考我之前的博客,Linux 下ffmpeg的安装 。推荐使用安装包的形式,自己源码编译可能耗时较久,而且会遇上各种依赖问题。

安装好ffmpeg后,我们便可以使用该工具对原始视频进行处理,以得到不同分辨率和码率的视频。这也是DASH的最intuitional最精华的思想所在,针对不同的网络状况,选择最合适的视频,达到较好的播放效果,至于如何选择,这个是自适应算法的话题了,这里暂且不表。

ffmpeg -i panda.mp4 -s 320x180 -c:v libx264 -b:v 500k -g 90 -an panda_video_320x180_500k.mp4

使用上面这条命令对原始视频进行处理,其中涉及好几个参数,解释一下:

参数 含义
-i 表示输入的文件
-s 使用的帧大小
-c:v 使用的codec(不知道怎么翻译,大概是编码器的意思)
-b:v 使用的码率
-g 图像组大小(GOP length)
-an 记成audio no吧,不要编码audio

以上命令参考了Making Your Own Simple MPEG-DASH Server 得到第一个视频后,“依葫芦画瓢”,改变参数,得到剩下的几个视频。

这是供参考的参数设置:

ffmpeg -i panda.mp4 -s 320x180 -c:v libx264 -b:v 500k -g 90 -an panda_video_320x180_500k.mp4
ffmpeg -i panda.mp4 -s 640x360 -c:v libx264 -b:v 750k -g 90 -an panda_video_640x360_750k.mp4
ffmpeg -i panda.mp4 -s 640x360 -c:v libx264 -b:v 1000k -g 90 -an panda_video_640x360_1000k.mp4
ffmpeg -i panda.mp4 -s 1280x720 -c:v libx264 -b:v 1500k -g 90 -an panda_video_1280x720_1500k.mp4

注意到我们只编码了视频,而没有编码音频,这是因为在DASH中我们需要将音视频分开进行处理。所以下一步就是音频处理,仍然是用ffmpeg

ffmpeg -i panda.mp4 -c:a aac -b:a 128k -vn panda_audio_128k.mp4
解释下各个参数

参数 含义
-i 表示输入的文件
-c:a 使用的codec
-b:a 使用的码率
-vn 记成video no吧,不要编码video

敲了这么多命令,终于完成了第一步(其实完全可以写个shell脚本来完成),接着进行下一步。


使用mp4dash生成dash切片及mpd文件

这里我最先参考了Making Your Own Simple MPEG-DASH Server 中的做法,用mp4box来作切片,这个工具自己之前用过,不陌生。把mp4box处理得到的文件传到服务器后,满怀期待打开播放器,放不出来,控制台看看错误,

“Failed to load http://**/manifest.mpd: No ‘Access-Control-Allow-Origin’ header is present on the requested “.

然后各种搜索,按照提示在Nginx配置中添加了CORS支持还是不行,无奈换用另外一个工具bento4的mp4dash.

先在官网 下载bento4,Linux有编译好的供下载,当然也可以下载源码自己编译。这里我们选择编译好的版本。

下载好后我们需要用到的两个小工具都在

/your_bento4_dir/bin

中,一个是mp4fragment,另外一个就是mp4dash了。使用的方法是先用mp4fragment来将视频fragment(怎么知道自己的视频是否已经fragment处理?运行mp4dash来处理视频,如果没有的话,会提示),然后用mp4dash来进行下一步处理,直接放官网的说明吧

Once you have fragmented MP4 files to work with as input, you can generate a DASH presentation, including an MPD and media files or media segments. For single-bitrate streaming, a single MP4 file is required. For multi-bitrate streaming, you will need a set of MP4 files that have been encoded with closed GOPs (Group Of Pictures) with equal durations. Also, the audio tracks in all the files should be encoded with the same parameters. Once you have your input files, you can use the mp4dash tool to automatically generate the DASH MPD and optionally split the MP4 file into individual file segments.

最后一句话最关键,大概意思就是把之前那些文件全部交给mp4dash,它自动帮你把剩下的活儿全干了,超贴心。

mp4dash命令大概是这样的:

mp4dash panda_1280x720_1500k_f.mp4 panda_640x360_750k_f.mp4 panda_640x360_1000k_f.mp4 panda_320x180_500k_f.mp4 panda_audio_128k_f.mp4

使用默认参数就可以了。

然后在output文件夹中,生成了

audio
stream.mpd
video

下一步要做的工作就是把这些东西全部上传到服务器中。


上传文件至服务器

在完成了上面的工作后,使用ftp工具将生成的文件上传到web服务器的根目录中(就是放index.html的那个地方),打开播放器,填好mpd文件的位置,点击“load”,
Nginx 搭建DASH服务器_第2张图片
(图2:播放测试)

视频正常播放,图片2下方的曲线显示视频buffer大小随着视频码率变化的情况。


“紫薇,等等”

就在我点击保存,准备发布这篇博客的时候,我发现我漏掉了重要的一点,那就是我其实是修改过nginx的配置的,如果不修改配置的话,会怎么样呢?

于是

mv /usr/local/nginx/conf/nginx.conf nginx_backup2.conf #把现在用的配置备份
mv /usr/local/nginx/conf/nginx_backup.conf nginx.conf #把原来的备份还原

然后

nginx -t #检查配置
nginx -s reload #重载配置

再次尝试播放,

“Failed to load http://**/video/video/avc1/1/init.mp4: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://players.akamai.com’ is therefore not allowed access.”

无法正常播放,所以是需要这个配置的,具体是在你的nginx配置文件中添加

location /
{
add_header Access-Control-Allow-Methods “GET,OPTIONS,POST,HEAD,P UT,DELETE”;
add_header Accept-Ranges “bytes”;
add_header Access-Control-Allow-Origin “*”;
add_header Access-Control-Expose-Headers “Content-Lengrh,Content -Range,Date,Server,Transfer-Encoding,origin,range,x-goog-meta-foo1”;
}

其他web服务器的设置可能会差异,具体可以参考HTTP访问控制(CORS)

具体是怎么回事大家可以看看参考链接中的解释,才疏学浅,我就不展开了(捂脸,我不是个好博主)。

reference

1.Dash相关领域知识总结
2.Linux 下ffmpeg的安装
3.Making Your Own Simple MPEG-DASH Server
4.mp4dash
5.HTTP访问控制(CORS)
5 6.panda 视频:密码: cp92

你可能感兴趣的:(Linux)