1。官方文档:http://developer.apple.com/resources/http-streaming/
2。苹果http视频点播技术http://rainbird.blog.51cto.com/211214/507958
如何做内容加密
HTTP Live Streaming支持在m3u8中指定一个key文件(目前支持16-octet 的AES-128加密),然后每个视频切段都使用这个key来加密。
可以所有切段共用一个key,也可以几个切段使用一个key,最细可以一个切段使用一个key。
然后把这些key文件加上验证功能,比如登陆才能读取到,这样就可以达到内容加密的效果了。
建议使用HTTPS来传输key文件。
注意:每个新key文件都会发起一个新的HTTP请求,因此每个切段一个key会大大加大服务器的连接数。
cache时的2个注意事项
1、最好不要用HTTPS来传送视频文件和m3u8文件,因为这样很容易穿透cache服务器。
2、另外,cache服务器必须知道m3u8文件缓存的时间不能大于一个视频切段的长度。
如何做冗余
可以在m3u8中指定2个BANDWIDTH相同的外部地址,这样客户端会自己在其中一路不可达时切换到另一路。
1、更长的分段导致更长的延迟和更长的初始化时间,切换码率(只能在切换分段的时候切)也更慢;
2、更短的分段导致对m3u8文件更密集的请求,从而导致更多网络流量;
3、Apple推荐的分段时长为10秒;
4、MPEG-TS流有比通常文件更多的头信息,会导致文件整体码率明显上升。可以使用Apple家的分段软件来减少和压缩其中不必要的头;
5、Apple家文档说10s分段的话会有约30s时延;
6、m3u8中可阻止客户端缓存文件,否则客户端会为了提高seek效率而缓存文件。
在写一个基于iphone的应用,主要是用来播放视频的.但是提交给苹果审核的时候却遭到百般刁难.尤其是关于在3G网络上播放视频流的限制:
9.4 Video streaming content over a cellular network longer than 10 minutes must use HTTP Live and include a baseline 64 kbps audio-only HTTP Live stream
也罢,想想也是,在移动互联网直接播放一个几十M上百M的文件也确实是太浪费有限的流量了.难道说在互联网上直接下载整个文件,而不管会不会看完就不浪费流量了吗?觉得确实有必要研究一下这项技术了.
apple http live streaming.基于http的视频流播放,笔者称它为视频切片技术,先是将视频文件通过mpegts编码,然后通过apple提供的小工具segmenter将视频文件切割成很多小文件并维护一个时间列表.这些文件可以直接放在网站目录下面通过http协议被下载播放.不幸的是苹果提供的segmenter只能工作在mac下,我们需要一个基于linux的开源解决方案.
几经搜索和尝试最后找到Carson McDonald的<<iPhone
HTTP Streaming with FFMpeg and an Open Source Segmenter>>虽然文中给出了几乎"完美"的解决方案,但是由于时代的发展和实际环境的不同,笔者着实将这篇文章细细研究了N久,于是也便有了这篇文章的出现.接下笔者会给出在ubuntu
10.04服务器编译安装ffmpeg和segmenter技术细节,并汇报一些心得.ok,go
on.
1.编译安装ffmpeg
删除不用的已安装文件,升级apt-get缓存,安装必要的开发工具及库文件
apt-get remove ffmpeg x264 libx264-dev libmp3lame-dev
apt-get update
apt-get install build-essential subversion git-core checkinstall yasm texi2html \
libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev \
libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev nasm yasm libbz2-dev
需要用到的库及下载地址
faad2-2.7.tar.gz
faac-1.28.tar.gz
lame-3.98.4.tar.gz
ffmpeg-0.6.1.tar.gz
1).faad2的安装最简单,直接解压然后
./configure &&make&&make install就ok了.
2).faac需要修改一个文件
vi +123 ./common/mp4v2/mpeg4ip.h
从123行开始修改此文件mpeg4ip.h,到129行结束。
修改前:
#ifdef __cplusplus
extern "C" {
#endif
char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
修改后:
#ifdef __cplusplus
extern "C++" {
#endif
const char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
然后默认安装:
./configure &&make&&make install
3).lame这样编译:
./configure --enable-nasm --disable-shared&&make&&make install
4).x264则是取的最新的代码,然后默认安装
git clone git://git.videolan.org/x264.git
./configure &&make &&make install&&cd ..
5).ffmpeg的编译参数
./configure --enable-gpl --enable-nonfree --enable-pthreads \
--enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libx264
为什么要选择ffmpeg-0.6.1呢?因为较早的版本编译完以后不能正常使用而从svn取的最新的代码则会好端端的出现Unknown
option "--enable-libfaad"错误.
2.安装segmenter
如果您有一定的linux使用经验,ffmpeg编译自然不在话下,也比较简单的,最难的就是这部分的segmenter的编译安装了.
先取出源代码:
svn checkout http://svn.assembla.com/svn/legend/segmenter/ segmenter
修改一个小地方:
vi +242 segmenter.c
把guess_format修改成av_guess_format
不然segmenter会在编译的时候提示:
segmenter.c:242: warning: ‘guess_format’ is deprecated (declared at /usr/local/include/libavformat/avformat.h:764)
接下来选择一种编译方式:
gcc -Wall -g segmenter.c -o segmenter -L/usr/include/ffmpeg/libavformat -lavformat -L/usr/include/ffmpeg/libavcodec -lavcodec -L/usr/include/ffmpeg/libavutil -lavutil -I/usr/include/ffmpeg/ -lbz2 -lm -lmp3lame -lxvidcore -lx264 -lfaad -lfaac -lpthread -lz
或者
gcc -Wall -g segmenter.c -o segmenter -L/usr/local/src/ffmpeg/ffmpeg-0.6.1/libavformat -lavformat -L/usr/local/src/ffmpeg/ffmpeg-0.6.1/libavcodec -lavcodec -L/usr/local/src/ffmpeg/ffmpeg-0.6.1/libavutil -lavutil -I/usr/local/src/ffmpeg/ffmpeg-0.6.1/ -lbz2 -lm
-lmp3lame -lxvidcore -lx264 -lfaad -lfaac -lpthread -lz
其实无论哪种编译方式都是手动指定了库文件的位置,不然的话编译不过,这个地方最坑人,费了很多很多时间!
3.编码视频文件并切割
这之前的地方如果你遵循笔者的安装文档和提示应该很容易就通过了(虽然笔者花费了大量的时间摸索).但是正确编译以后,你并不知道正确切割文件以后的效果是什么样的,所以笔者在这里花费了超级大量的时间,这也是笔者为什么坚持要写出这篇文章的原因.
先列出笔者犯的几个致命错误吧:
1).不按apple文档格式转码
因为笔者使用的输入文件在编码的时候是针对apple的设备优化过的,可以直接在apple设备上播放并获得良好的观看效果.而在使用原作者的编码参数:
ffmpeg -i <in file> -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -s 320×240 -vcodec libx264 -b 96k -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor
0.71 -bt 200k -maxrate 96k -bufsize 96k -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async 2 <output file>
时报错,在这种情况下,考虑到前一个原因,笔者自己摸索了一个编码代码:
ffmpeg -y -i <in file> -vcodec copy -acodec copy -vbsf h264_mp4toannexb <output file>
是可以正常编码和分割视频文件的.但是将应用提交给苹果审核后,苹果依旧给出了9.2的提示并拒绝了应用.这才想起来源视频在进行编码的过程中音频并没有使用64k的编码也没有单独增加一路音频流.
2).浪费时间解决可以忽略的错误提示
无论直接正常编译成功还是编译失败从别的机器上拷贝segmenter过来,在分割视频的时候都出现了:
[mpegts @ 0x2942160]max_analyze_duration reached
Output #0, mpegts, to 'a/index':
Stream #0.0: Video: libx264, yuv420p, 536x402, q=2-31, 90k tbn, 25 tbc
Stream #0.1: Audio: libmp3lame, 48000 Hz, 2 channels, 64 kb/s
[mpegts @ 0x2a08430]muxrate 1 bps, pcr every 5 pkts, sdt every 200, pat/pmt every 40 pkts
[NULL @ 0x2956900]missing picture in access unit
"max_analyze_duration reached"和"missing picture in access unit"的提示.最初这两个提示困扰了笔者很久,不断的在网上搜索寻找解决办法;不断的重新编译ffmpeg和segmenter;不断的更换视频输入源,重新编码;直到最后发现即便有这两个提示存在并不影响视频的正常播放的时候,笔者决定接受现实:这两个提示可以存在.
3).解决视频长度问题
即使上面走过了那么多的艰难,但是你还是会发现这个世界是不完美的.毕竟segmenter是苹果开发了以后用在mac上的.不知道是移值到linux还是什么原因,这个工具的表现有点让人理解不了.它的参数是这样的:
segmenter <input MPEG-TS file> <segment duration in seconds> <output MPEG-TS file prefix> <output m3u8 index file> <http prefix>
第二个参数,你指定视频分割间隔的时候,比如说指定了15秒.如果你的视频时长是32秒的话,你的视频文件会被分割成3段(每15秒一段,最后的2秒一段),而最后一段的播放时长,它竟然会写成15秒!明明就2秒干嘛要写成15秒!!!用quicktime还好说,它似乎会自动检查视频的时长纠正时间和进度条,而在iphone上,显示时长是取的视频文件里的时长(15x3=45s),而下载进度条显示的是实际文件的视频时长(32s),这样的话,你会发现,当一个视频被播放完的时候,时间还差13秒!怎么办呢?没办法了,我是看不懂c程序,但是哥会php啊,不就是时间不对嘛,哥给你重新计算一下时间重写一下文件,搞定!
4).测试时的网速问题
为了"大规模"的随机测试视频,笔者是在服务器上直接编码测试的.无论在quicktime还是iphone上,正常的表现应该是视频会被提前下载两到三个小段.结果笔者测试的时候,发现视频总是播一条下一段,笔者郁闷了很久发现:原来是公司网速太慢了.直接在iphone上用3G测试,很给力!
5).转码耗用cpu问题
视频转码是最费cpu的东东,如果想提高转码速度还是买两颗8核的cpu一块干活吧,速度哇哇的,你懂的.
ok,废话半天说一下笔者用的转码指令.
ffmpeg -y -i a.mp4 -f mpegts -acodec libmp3lame -ar 48000 -ab 64k -vcodec libx264 -b 250k \
-flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 \
-coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 \
-bt 250k -maxrate 250k -bufsize 250k -rc_eq 'blurCplx^(1-qComp)' \
-qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -async 2 a.ts
segmenter a.ts 15 a a/index.m3u8 http://vod.rainbird.cc/
rm -rf a.ts
这个时候测试时访问的url为:http://vod.rainbird.cc/a/index.m3u8(随便写的,请勿对号入座)
4.nginx配置
vi mime.types
添加以下两条儿,重启nginx
application/x-mpegURL m3u8;
video/MP2T ts;
一切顺利的话,这时候可以通过测试url观看视频了.
<wbr></wbr>
参考文档:
iPhone
HTTP Streaming with FFMpeg and an Open Source Segmenter
Howto:Install and use the latest FFmpeg and x264
分享到:
相关推荐
本文将深入解析该系统的核心组件和关键技术,帮助你了解如何利用这些源码构建一个功能完善的视频点播应用。 1. **项目构建工具与依赖管理** - `gradlew.bat` 和 `gradlew` 是Gradle构建工具的Windows和Unix版本,...
Linux下视频点播系统的实现 Linux 操作系统作为全球最流行的开源操作系统之一,已经广泛应用于各个领域,而视频点播系统作为一种常见的多媒体应用,也逐渐成为了Linux平台上的一个重要组件。 本文将详细介绍如何...
综上所述,Android直播和点播视频源码涉及了多媒体处理、网络通信、用户交互等多个方面的技术。对于开发者来说,理解并掌握这些知识点对于开发高质量的视频应用至关重要。而"VST-1.1.9-0928"这个源码项目则为学习和...
HLS(HTTP Live Streaming)是由苹果公司开发的一种基于HTTP的流媒体互联网传输协议,主要用于适应不同的网络条件,确保视频播放的流畅性。HLS协议将视频分割成多个小段(m3u8索引文件),用户可以根据自己的网络...
基于Linux的视频点播系统的实现 本文介绍使用Darwin流服务器实现Linux下的视频点播系统的方法和步骤。Darwin流服务器是苹果公司QuickTime流服务器的opensource版本,是完全基于QuickTime流服务器代码开发的,其实现...
在线直播和视频点播是现代互联网技术的重要组成部分,它们为用户提供了实时互动和灵活观看的体验。本篇文章将深入探讨这些技术背后的关键知识点。 首先,我们来看“在线直播”。在线直播是一种通过互联网实时传输...
综上所述,该源码主要实现了视频M3U8切片加密、TS文件批量缓存管理及苹果CMS系统自动入库等功能,适用于搭建高性能的视频点播平台。通过对以上关键技术点的理解和掌握,可以帮助开发者更好地理解并应用到实际项目中...
HTTP渐进下载(PD)流媒体允许用户边下载边播放,常用于视频点播(VOD)。然而,这种方法可能会因网络波动导致播放中断,因为TCP的重传机制可能无法确保数据准时到达。 为解决OTT视频的播放质量问题,出现了自适应...
IPTV 和 OTT 视频技术是指基于 Internet 协议的电视技术,它们提供了高质量的视频服务,包括实时视频和点播视频服务。IPTV 技术栈包括 Tunneling & Link & Physical Layer、IP、UDP、RTP、TCP 等协议栈,而 OTT ...
HLS是一种基于HTTP的流媒体传输协议,常用于实时或点播视频服务,能够适应不同网络条件下的播放质量。`m3u8`文件是HLS流的播放清单,包含了视频的不同码率版本,播放器会根据网络状况自动选择合适的流进行播放,确保...
网络广播是一种将音频、视频或者其他多媒体内容通过互联网实时或异步传输的技术,它极大地扩展了传统广播的覆盖范围,使得用户可以随时随地收听或观看节目。随着互联网技术的快速发展,网络广播已经成为了信息传播的...
使用青苹果影视系统(MacCms)可以快速搭建一个免更新、免维护的影视聚合、影视导航、影视点播网站。青苹果影视系统(MacCms)功能列表1、数据模块一键对接市面上的影视资源站API接口、现已支持FeiFeiCms、MacCms、...
在描述中,提到了在Ubuntu系统上使用Nginx进行视频服务器的搭建,并且使用ffmpeg来处理视频文件为HLS协议的分片以支持视频点播。HLS(HTTP Live Streaming)是苹果公司开发的一种视频流媒体传输协议,使得视频可以...
【在线学习 HLS v1.21】是一种在线学习平台的技术实现...综上所述,HLS v1.21技术在在线学习场景下提供了高效、灵活的视频点播解决方案,确保了学生能够在各种设备上顺畅地学习录播课程,提升了在线教育的用户体验。
- **基于Web和流媒体的校园网络视频点播系统:**这是一种利用流媒体技术构建的视频点播(VOD)系统,可以在学校内部网络上实现视频资源的在线点播。该系统可以为学生提供灵活的学习方式,教师也可以通过这种方式分享...
流媒体的类型主要分为两种:直播流媒体(Livestreaming)和视频点播(Video on demand)。例如,收听广播电台属于直播流媒体的一种形式,而在线观看电影则属于视频点播。 为了让流媒体内容流畅播放,需要选择合适的...
HLS(HTTP Live Streaming)是苹果公司提出的一种基于HTTP的流媒体网络传输协议,用于实时音频和视频流的传输。M3U8是HLS使用的播放列表文件格式,包含媒体文件的URL和时间片段信息。 **DASH** DASH(Dynamic ...
2. HLS流媒体技术:m3u8文件基于HTTP Live Streaming技术,这是一种由苹果公司开发的流媒体传输技术,允许通过普通的HTTP服务器进行视频流的分发。HLS支持自适应比特率流,也就是说,视频流会根据用户的网络条件自动...