自适应流媒体传输(一)——DASH媒体内容的生成

DASH(Dynamic Adaptive Streaming over HTTP)即自适应流媒体传输,典型的系统框图如下

自适应流媒体传输(一)——DASH媒体内容的生成_第1张图片

简单概括来说,就是在服务器端提前存好同一内容的不同码率、不同分辨率的多个分片以及相应的描述文件MPD,客户端在播放时即可以根据自身性能以及网络环境选择最适宜的版本。更多详细的内容可以参见MPEG组织出台的标准。

在这篇文章中主要说一下如何生成服务器端的媒体内容和相应的MPD文件。通过上面的框图可以看到,主要的流程即输入-编码-分片-组织MPD。下面将首先介绍一下目前网络上有的一些能在服务器端完成相应全部或部分工作的开源工程,然后介绍一个本人开发的用于完成这一任务的开源项目以及一个整合了此项目的java web示例。

网络上已有的开源项目

1、MPD验证器 MPEG-DASH MPD Validator 

这是一个在线的MPD验证器,通过上传自己的MPD文件,就可以检验该文件与标准的一致性。该验证器支持到ISO/IEC 23009-1:2012。验证结果如下图

自适应流媒体传输(一)——DASH媒体内容的生成_第2张图片

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
前面说到DASHEncoder的作者表示已经不再对其进行维护了,其实是在他们转而开发了这个在线的编码分片与MPD生成平台。和许多类似的平台的一样,要体验完整的功能、更大的云端空间是需要付费的。此平台除了可以生成DASH内容外,也支持HLS,而且生成的媒体内容可以直接存储在他们的服务器上。界面如下

自适应流媒体传输(一)——DASH媒体内容的生成_第3张图片

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源码地址。


你可能感兴趣的:(dash,流媒体)