自适应流媒体传输(一)——DASH媒体内容的生成
来源:互联网 发布:ftp端口正被使用怎么办 编辑:程序博客网 时间:2024/06/15 01:46
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 : x264audio-encoder : ffmpegAACmultiplexer : mp4box#store-psnr sql-host : localhostsql-user : rootsql-pw : sql-database : dashadd-non-segmented#use-ffmpeg-pipeffmpeg-opt : -f rawvideo#input-res : 384x208#input-res : 352x288input-res : 854x480#========================================# x264 Options#========================================bitrate : 300#bitrate : 250@480x360|500@480x360|1000#bitrate : 200|400|600|1000statistics : stat.tempgop : 48scenecut : 0 profile : baselinepreset : slowinput : /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.mp4passes : 1const-filesize : 0#Additional Options for Encoding#pass1 : --frames 500 --fps 29.970029pass1 : --verbose --fps 24pass2 : --verbose --psnr #========================================# FFMPEG AAC Options#========================================# [channels, samplerate, bitrate]#audio-quality : 2,44100,48|2,44000,128#audio-quality : 2,44100,48audio-quality : audio-input : /home/stefan/sintel_trailer-audio.flacaudio-codec : libfaac#========================================# MP4Box Options#========================================#AV Muxing#mux-combi : 300@48|600@128mux-combi : fragment-size : 2000segment-size : 2000rap-alignedsegment-name : sintelfolder-prefix : sintel#========================================# MPD Options#========================================mpd-name : sintel.mpdurl-root : http://localhost/tests_updates/#set-base-url mpdActStandardPostfix : _actVersion.mpdduration : 9M4Stransform-mpdminBufferTime : 2.0SsegDuration : 2#========================================# Other Options#========================================3、bitcodin
前面说到DASHEncoder的作者表示已经不再对其进行维护了,其实是在他们转而开发了这个在线的编码分片与MPD生成平台。和许多类似的平台的一样,要体验完整的功能、更大的云端空间是需要付费的。此平台除了可以生成DASH内容外,也支持HLS,而且生成的媒体内容可以直接存储在他们的服务器上。界面如下
4、Bento4
该项目提供了用于MP4和DASH格式的一套工具集,例如用于查看mp4封装格式信息的mp4info、生成HLS内容的mp4-hls等。用于生成DASH内容的工具主要有两个,mp4-dash和mp4-dash-encoder。mp4-dash-encode可以将单个序列编码为多个不同码率的序列,并进行分片,不过默认的码率是在一个最低值(默认500k)和最高值(默认2M)之间进行平均分配,不能随意选择码率。mp4-dash则可以利用已有的单个或多个文件组织生成MPD。所以二者往往合作使用。具体使用教程看这里。
在这里简单描述一下使用方法
首先需要自己使用ffmpeg将原始视频编码为你需要的码率和分辨率等,然后使用mp4fragment工具将mp4 fragment化,接下来就可以使用mp4-dash工具完成dash内容的生成工作了
5、GPAC
与Bento4类似,GPAC也是一个开源的多媒体工具包,包括用于MP4打包的mp4box等。用于生成DASH内容的工具是DASHCast,也是通过读取输入文件和配置文件来生成DASH内容和对应的MPD文件,但是测试发现生成直播内容时一切正常,但是生成点播内容时会出现错误,无法使用。此外,这个工具包里还有一个mp4box也支持DASH内容和MPD的生成,不过需要搭配x264或ffmpeg来完成编码的工作。一个简单的使用教程看这里 。
本人制作的开源示例
1、DASHEncoder2
正如这个示例的名字所示,我是在DASHEncoder的基础上进行修改制作的这个示例,修改的内容包括:重新设计了结构,将编码、分片和MPD生成这三个步骤完全分离;编码工作全部使用ffmpeg完成,不再需要x264;生成的媒体分片内容根据属性组织存放在各自的文件夹中;暂时去掉了与数据库相关的功能;增加了一些文档,易于使用;修改了一些bug。经过测试,是可以使用的,当然也可能会有一些暂未发现的bug,希望大家提出,我计划持续维护这个项目。
源码下载地址在这里,会进行更新的github地址在这里。
更新:目前的dashencoder基于ffmpeg和gpac的mp4box工具,但就实际使用来看,mp4box生成的dash流有很多播放器不支持,例如vlc,在下一步的修改计划中,将改成利用bento4工具.
2、DASH website demo
在以上项目的基础上,我还制作了一个示例网站,利用这个网站可以实现bitcodin类似的功能,当然界面就没有那么绚丽了,基本的选择文件、上传文件、自动生成DASH内容、播放DASH内容的功能都包括了。在使用的时候需要将DASHEncoder2添加到系统环境变量中。这个网站是在我师哥的代码的基础上做的,原本是一个不支持DASH内容的视频网站示例。还是一样,如果有一些bug,希望大家提出,我同样计划持续维护这个项目。
源码下载在这里,会进行更新的github源码地址。
- 自适应流媒体传输(一)——DASH媒体内容的生成
- 流媒体协议——DASH
- DASH(Dynamic Adaptive Streaming over HTTP)自适应流媒体
- 对流媒体相关协议的认识(一) ——流媒体说明
- 流媒体协议——DASH(chapter-6)
- 流媒体协议——DASH(chapter-6)
- 自适应流媒体传输(二)——为什么要使用fragmented MP4
- 自适应流媒体传输(三)——和TS格式说再见
- 北京大学计算所网络视频组动态自适应流媒体(DASH)项目主页
- 流媒体通信协议HLS与DASH的对比
- 流媒体通信协议HLS与DASH的对比
- 流媒体通信协议HLS与DASH的对比
- 流媒体技术基础-流媒体传输协议(一)
- 流媒体的传输协议
- 流媒体的传输协议
- 局域网的传输媒体
- 流媒体传输知识整理(一)
- 基于DASH的视频分片传输
- 黑马程序员__java之多线程上
- Leetcode 8 - String to Integer (atoi)
- Gradle中productFlavors的使用指南
- Hdu 2039(水题) 解题报告
- ui-router系列文章
- 自适应流媒体传输(一)——DASH媒体内容的生成
- java线程池使用
- POJ2192 Zipper(DP||DFS)
- poj 1651 Multiplication Puzzle 【区间dp】
- Java的单例模式
- 前端性能优化的14个规则,学会就偷着乐
- 蓝桥杯 算法提高 概率计算 (概率DP)
- myeclipse 10和myeclipse2015软件和破解工具
- 14443协议浅谈—TYPE_A与TYPE_B之比较[1]