`
shappy1978
  • 浏览: 675989 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]苹果http视频点播技术

阅读更多

google上确实没有找到其他开源的分段代码,但是这个代码本身并不复杂,可以自己参考着修改。

apple只提供了mac版本的mediafilesegmenter,但是这个工具封装的更好,它可以接受h.264/mpeg4等格式的源,不象segmenter只能接受mpegts格式的文件,还需要ffmpeg转换一下。

作者说错了,segmenter不是长度错误,而是根本没有把实际片段长度写入播放列表,而是全部写死为输入的片段长度,实际测试发现,由于是一个package顺序写入,往往一个片段会又较大的时间误差,可以到5秒以上,这样累计下来实际上到了后面就只有音频没有视频了。重新校订片段长度可以解决。感觉这个代码写得很粗糙,甚至列表文件重复写入。

分段的另一个缺点是不好seek,drag的时候往往会跳到某个片段,而且很不准,这也是没办法的事情了。

昨天在linux服务器上编译搞了一天,没办法,第一次接触linux服务器,经验:

1 用干净的源代码编译

2 用类似yum之类的命令安装的ffmpeg是无法使用的,x264也一样

3 编译segmenter还是无需指定类库路径

//***************************

  在写一个基于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服务器编译安装ffmpegsegmenter技术细节,并汇报一些心得.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 installok

         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"的提示.最初这两个提示困扰了笔者很久,不断的在网上搜索寻找解决办法;不断的重新编译ffmpegsegmenter;不断的更换视频输入源,重新编码;直到最后发现即便有这两个提示存在并不影响视频的正常播放的时候,笔者决定接受现实:这两个提示可以存在. 

         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观看视频了.

 

参考文档:

 

iPhone HTTP Streaming with FFMpeg and an Open Source Segmenter

Howto:Install and use the latest FFmpeg and x264

"Best Practices for Creating and Deploying HTTP Live Streaming Media for the iPhone and iPad" and "Media Stream Validator Tool Errors/Warnings Explained"

//***************************

童鞋门,翻译的文章害死人啊,还是琢磨一下上面的英文版吧,特别是后面提到的

 

  1. The supported bitrates for streaming are: 100 Kbps to 1.6 Mbps
  2. The suggested bitrates for streaming are*:
    • Low – 96 Kbps video, 64 Kbps audio
    • Medium – 256 Kbps video, 64 Kbps audio
    • High – 800 Kbps video, 64 Kbps audio

 

------

Step 7: Create a variable rate HTTP stream

Once you have creating a single stream down you need to try out creating a variable bitrate stream. There isn't much to it, just create different bitrate encoded streams and link to their stream definition files in a separate stream definition file. Here is an example:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=96000
http://192.168.132.15/ipv/stream-96k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000
http://192.168.132.15/ipv/stream-256k.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000

http://192.168.132.15/ipv/stream-800k.m3u8

 

如果编写完毕,可以用下面的命令行测试

mediastreamvalidator validate http://xxx/playlist.m3u8

分享到:
评论
1 楼 zbb128 2012-04-12  
[flash=200,200][/flash]
[url][/url][img][/img]

    [*]
引用
[u][/u][i][/i][b][/b]

相关推荐

    青苹果影视系统源码 影视聚合影视导航影视点播网站源码

    青苹果影视系统源码 v1.4.15,使用青苹果影视系统(MacCms)可以快速搭建一个免更新、免维护的影视聚合、影视导航、影视点播网站。 功能列表 1、数据模块 – 一键对接市面上的影视资源站API接口、现已支持FeiFeiCms...

    青苹果影视系统源码 影视聚合 影视导航 影视点播网站源码

    3、点播模块 – 视频模块的基础在线点播功能,使用大名鼎鼎的Dplayer作为H5播放器、常见的包括mp4、m3u8、flv、mp3等格式都支持。 4、微信公众号 – 可对接微信公众号开发者工具(影视机器人系统),对接后微信用户...

    精仿芒果Tv超美听书模板源码 苹果cms内核.zip

    精仿芒果TV超美听书模板源码苹果cms内核,页面非常漂亮,简单大气,用户来了就跑不了了.自定义程度化高,技术厉害的分分钟可以改成自己喜欢的样子!!!

    青苹果影视系统源码影视聚合影视导航影视点播网站源码下载

    3、点播模块 – 视频模块的基础在线点播功能,使用大名鼎鼎的Dplayer作为H5播放器、常见的包括mp4、m3u8、flv、mp3等格式都支持。 4、微信公众号 – 可对接微信公众号开发者工具(影视机器人系统),对接后微信用户...

    青苹果影视系统-PHP

    使用青苹果影视系统(MacCms)可以快速搭建一个免更新、免维护的影视聚合、影视导航、影视点播网站。青苹果影视系统(MacCms)功能列表1、数据模块一键对接市面上的影视资源站API接口、现已支持FeiFeiCms、MacCms、...

    绿豆最新5.0.3白菜app源码苹果cms10聚合后端java原生前端【全开源免授权】

    更新记录 (v5.0.3-2022、1、15) 1、去除快手短视频(已完成...8、修复积分点播,这个功能我看外面泛滥的那些版本都没有修复.你们买那些残次品的时候记得也要看看功能是不是完整的嘛!(已修复) ,小白勿下,不提供技术支

    小峰视频云解决方案.zip

    云点播(Video on Demand,VOD)基于公司多年技术积累与基础设施建设,为有音视频应用相关需求的客户提供包括音视频采集上传、存储管理、自动化转码处理、加速播放、媒体资源管理和音视频通信服务为一体的一站式 ...

    网页播放器

    * 支持跨终端播放,适配PC终端/苹果终端(含IPHONE、IPAD)/安卓终端(含安卓手机和安卓平板);New * 支持RTMP协议(支持red5,wowza,FMS等rtmp流媒体点播与直播);也支持http协议; New * 支持5种广告功能:支持前置...

    欣荣泉安防视频监控软件-单机版

    欣荣泉视频监控软件是一套基于全新技术、云集众多行家实力并潜心钻研多年的成果。能够真正实现多级联网、多种硬件品牌兼容、多种操作平台兼容等问题的大型专业的视频监控平台软件 有效规避了全球眼平台中的一些弊端...

    eqxue-open-v1.0.1-install.zip

    E启学独创的学习引擎,开发了一对一直播、大班直播、点播课程、音频课程、作业、考试等12种教学手段,让教育机构按需打造个性化的教学模式。 2、题库系统,智能化开展考试测评 E启学独立研发的在线题库平台是针对...

    扩展智能电视的存储空间的方法.docx

    它将实现网络搜索、IP电视、视频点播(VOD)、数字音乐、网络新闻、网络视频电话等各种应用服务。用户可以搜索电视频道和网站,录制电视节目,能够播放卫星和有线电视节目以及网络视频。智能电视将为广大用户打造一个...

    Google.Android开发入门与实战

     随着3G的到来,无线带宽越来越高,使得更多内容丰富的应用程序布置在手机上成为可能,如视频通话、视频点播、移动互联网冲浪、在线看书/听歌、内容分享等。为了承载这些数据应用及快速部署,手机功能将会越来越...

Global site tag (gtag.js) - Google Analytics