flv、MP4 视频播放问题

对着背影说爱祢 提交于 2019-11-29 07:25:00

      我们平常笼统说的「视频格式」其实包含三个部分:视频编码、音频编码、容器格式。其中「编码」这个概念其实又包含两个方面:编码和解码。「视频编码」作为动词指的是将动态的图像信息转化为二进制数据的过程;其逆过程称为「视频解码」。「视频编码」作为名词则通常指的是某种特定的编码方式。同样的概念也适用于「音频编码」,只不过它转化的是声音信息。大多数「视频文件」都同时包含视频和音频,因此编码后至少都有两组二进制数据,并且两组数据必须按照特定的方式同步起来,否则我们看到的画面和听到的声音将不吻合。为了解决编码后多组不同类型的的数据的存储、传输问题,需要将他们按照一定的规律组织起来,这种组织方式即是「容器格式」。
      我们常见的视频文件扩展名包括 .avi, .rmvb, .mp4, .mkv 等。其实扩展名都是指的某种容器格式。这些容器里面存放的数据可能采用了多种不同的编码方式。例如,常见的 avi 文件里面存放的通常是 xvid 或 divx 编码的视频和 mp3 编码的音频。rmvb 文件里面存放的通常是 RV40 编码的视频和 cook 编码的音频。mp4 文件里面通常存放的是 H.264 编码的视频和 AAC 编码的音频。mkv 文件里面存放的则可能包含前面各种。
       目前业界主流的封装是MP4.因为MP4有着良好的特性,并对HTML5友好。mp4新规范实际已经支持无缝拼接,真正流媒体封装器。封装格式一般都对应的有很多编码格式,目前主流的H264编码器是 开源的x264,完美的平衡了各种因素。
       其实flv也是流式文件,比其它格式更简单,但是apple同样不支持。android ice cream也已经原生支持 hls.而且 使用ts切片方式 可以很容易实现流加密处理。不过HLS它有一个缺点,那就是Chrome(PC)迄今为止内建不支持HLS(m3u8),但是Android/iOS的浏览器支持m3u8.
rtmp和rtsp都要求特殊的服务器,例如rtmp要求FMS/red5, rtsp要求darwin等,hls只要普通的server。
       视频监控和视频通话。这类流媒体采用HLS明显是不合适的,一般采用HTTP progressive streaming,Android在4.0开始支持这种流媒体格式。能够支持HPS的容器必须是流式的,如FLV, MKV, Android将支持WEM(即MKV)容器,携带VP8视频格式。因此选择流媒体传输方式还有一个就是 HPS .
       国内的很多视频网站都支持自动切换的,例如在普通PC浏览器上使用传统的flv播放,在Android/iOS上使用m3u8,在Chrome(PC/Android)上使用mp4,方法就是video里提供多个source.
HTTP Live Streaming技术,Adobe 的 Flash 流媒体服务器的新版本也要支持这个技术。有一个巨大优势:自适应码率流播(adaptive streaming)。效果就是客户端会根据网络状况自动选择不同码率的视频流,条件允许的情况下使用高码率,网络繁忙的时候使用低码率,并且自动在二者间随意切换。这对移动设备网络状况不稳定的情况下保障流畅播放非常有帮助。实现方法是服务器端提供多码率视频流,并且在列表文件中注明,播放器根据播放进度和下载速度自动调整。
特点是将流媒体切分为若干 TS 片段(比如每10秒一段),然后通过一个扩展的 m3u 列表文件将这些 TS 片段集中起来供客户端播放器接收。一旦切分完成,之后的分发过程完全不需要额外使用任何专门软件,普通的网络服务器即可,大大降低了 CDN 边缘服务器的配置要求,可以使用任何现成的 CDN。分发使用的协议是最常见 HTTP,代理服务器对这个协议的缓存优化相当成熟,而很少有代理服务器对 RTSP 的进行缓存优化。这对播放(软)实时视频有相当大的优势,因为这样分发后,对源服务器的负载压力小得多。同样的好处也是存在的:如果你要在一段长达一小时的视频中跳转,如果使用单个 MP4 格式的视频文件,并且也是用 HTTP 协议,那么需要代理服务器支持 HTTP range request 以获取大文件中的一部分。不是所有的代理服务器都对此有良好的支持。而 HTTP Live Streaming 则只需要根据列表文件中的时间轴找出对应的 TS 片段下载即可,不需要 range request,对代理服务器的要求小很多。所有代理服务器都支持小文件的高效缓存。

解决方案:
统一使用主流的H264编码器。
1、上传的视频,用ffmepg检测编码,例如:MP4 编码转成H264. web端播放转码后的 flv\mp4.通过nginx代理,安装flv\mp4 扩展。nginx中的Flv Stream模块能实现flv流媒体的功能,而且支持flv视频进度条拖拽,可以安装yadmi,yadmi的作用是为flv文件添加关键帧,实现拖动播放。另外nignx还可以作为方向代理服务器代理后端基于Flash Media Server或者Red5的RTMP/RTMP流媒体服务器
2、转码后的flv\mp4, 生成TS 片段,扩展的 m3u 列表文件, 支持android客户端和IOS客户端。
3、Android/iOS的浏览器支持m3u8,同时也支持标准的mp4.

参考资料:
nginx搭建mp4、flv流媒体服务器
http://lcf19890121.iteye.com/blog/2035650

利用nginx搭建http和rtmp协议的流媒体服务器
http://5iqiong.blog.51cto.com/2999926/1132639

CentOS6下基于Nginx搭建mp4/flv流媒体服务器(可随意拖动)并支持RTMP/HLS协议(含转码工具)
http://hdu104.com/294

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!