DASH(Dynamic Adaptive Streaming over HTTP)即自适应流媒体传输,典型的系统框图如下
简单概括来说,就是在服务器端提前存好同一内容的不同码率、不同分辨率的多个分片以及相应的描述文件MPD,客户端在播放时即可以根据自身性能以及网络环境选择最适宜的版本。更多详细的内容可以参见MPEG组织出台的标准。
在这篇文章中主要说一下如何生成服务器端的媒体内容和相应的MPD文件。通过上面的框图可以看到,主要的流程即输入-编码-分片-组织MPD。下面将首先介绍一下目前网络上有的一些能在服务器端完成相应全部或部分工作的开源工程,然后介绍一个本人开发的用于完成这一任务的开源项目以及一个整合了此项目的java web示例。
1、MPD验证器 MPEG-DASH MPD Validator
这是一个在线的MPD验证器,通过上传自己的MPD文件,就可以检验该文件与标准的一致性。该验证器支持到ISO/IEC 23009-1:2012。验证结果如下图
2、DASHEncoder
该项目可以通过读入配置文件或命令行来完成DASH媒体内容和MPD文件的生成。并且支持计算PSNR值并存入mysql数据库。它的实现方法基本是通过调用x264\ffmpeg\mp4box来实现的。但是其作者表示目前该项目的维护已经结束,在github上下载的代码也已经无法正确运行。下面贴一个它的配置文件的示例
#======================================== # Config File for DASH Encoder #======================================== #======================================== # General Options #======================================== dest-directory : /opt/lampp/htdocs/tests_updates/ video-encoder : x264 audio-encoder : ffmpegAAC multiplexer : mp4box #store-psnr sql-host : localhost sql-user : root sql-pw : sql-database : dash add-non-segmented #use-ffmpeg-pipe ffmpeg-opt : -f rawvideo #input-res : 384x208 #input-res : 352x288 input-res : 854x480 #======================================== # x264 Options #======================================== bitrate : 300 #bitrate : 250@480x360|500@480x360|1000 #bitrate : 200|400|600|1000 statistics : stat.temp gop : 48 scenecut : 0 profile : baseline preset : slow input : /home/stefan/sintel_trailer_2k_480p24.y4m #input : /home/stefan/foreman_cif.y4m #input : /home/stefan/kingkong.mp4 #input : /media/Volume/MI200802010028-video_newsroom_hd_1080_p29_97-channelSelectionT0C0_T0C1.mp4 passes : 1 const-filesize : 0 #Additional Options for Encoding #pass1 : --frames 500 --fps 29.970029 pass1 : --verbose --fps 24 pass2 : --verbose --psnr #======================================== # FFMPEG AAC Options #======================================== # [channels, samplerate, bitrate] #audio-quality : 2,44100,48|2,44000,128 #audio-quality : 2,44100,48 audio-quality : audio-input : /home/stefan/sintel_trailer-audio.flac audio-codec : libfaac #======================================== # MP4Box Options #======================================== #AV Muxing #mux-combi : 300@48|600@128 mux-combi : fragment-size : 2000 segment-size : 2000 rap-aligned segment-name : sintel folder-prefix : sintel #======================================== # MPD Options #======================================== mpd-name : sintel.mpd url-root : http://localhost/tests_updates/ #set-base-url mpdActStandardPostfix : _actVersion.mpd duration : 9M4S transform-mpd minBufferTime : 2.0S segDuration : 2 #======================================== # Other Options #========================================3、 bitcodin
4、Bento4
该项目提供了用于MP4和DASH格式的一套工具集,例如用于查看mp4封装格式信息的mp4info、生成HLS内容的mp4-hls等。用于生成DASH内容的工具主要有两个,mp4-dash和mp4-dash-encoder。mp4-dash-encode可以将单个序列编码为多个不同码率的序列,并进行分片,不过默认的码率是在一个最低值(默认500k)和最高值(默认2M)之间进行平均分配,不能随意选择码率。mp4-dash则可以利用已有的单个或多个文件组织生成MPD。所以二者往往合作使用。具体使用教程看这里。
5、GPAC
与Bento4类似,GPAC也是一个开源的多媒体工具包,包括用于MP4打包的mp4box等。用于生成DASH内容的工具是DASHCast,也是通过读取输入文件和配置文件来生成DASH内容和对应的MPD文件,但是测试发现生成直播内容时一切正常,但是生成点播内容时会出现错误,无法使用。此外,这个工具包里还有一个mp4box也支持DASH内容和MPD的生成,不过需要搭配x264或ffmpeg来完成编码的工作。一个简单的使用教程看这里 。
1、DASHEncoder2
正如这个示例的名字所示,我是在DASHEncoder的基础上进行修改制作的这个示例,修改的内容包括:重新设计了结构,将编码、分片和MPD生成这三个步骤完全分离;编码工作全部使用ffmpeg完成,不再需要x264;生成的媒体分片内容根据属性组织存放在各自的文件夹中;暂时去掉了与数据库相关的功能;增加了一些文档,易于使用;修改了一些bug。经过测试,是可以使用的,当然也可能会有一些暂未发现的bug,希望大家提出,我计划持续维护这个项目。
源码下载地址在这里,会进行更新的github地址在这里。
2、DASH website demo
在以上项目的基础上,我还制作了一个示例网站,利用这个网站可以实现bitcodin类似的功能,当然界面就没有那么绚丽了,基本的选择文件、上传文件、自动生成DASH内容、播放DASH内容的功能都包括了。在使用的时候需要将DASHEncoder2添加到系统环境变量中。这个网站是在我师哥的代码的基础上做的,原本是一个不支持DASH内容的视频网站示例。还是一样,如果有一些bug,希望大家提出,我同样计划持续维护这个项目。
源码下载在这里,会进行更新的github源码地址。