最近接的音视频处理的项目比较多,停下来整理一下思路,分享一下我踩过的坑,希望能够帮到别人。
我们平时接触到的视频流一般有以下几种:
1.RTSP(Real Time Streaming Protocol)协议,RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。现在的主流摄像头(海康,大华)很多输出的都是RTSP数据流。
2.RTMP视频流(Real Time Messaging Protocol),Adobe公司开发的,RTMP协议就像一个用来装数据包的容器,这些数据既可以是AMF格式的数据,也可以是FLV中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的,在flash盛行的年代比较火,随着chrome对flash的屏蔽,哑火了,不过仍然是我们接下来处理的重要部分。
3.HLS(HTTP Live Streaming)协议,苹果公司实现的基于HTTP的流媒体传输协议,可实现流媒体的直播和点播,主要应用在iOS系统,为iOS设备(如iPhone、iPad)提供音视频直播和点播方案。HLS点播,基本上就是常见的分段HTTP点播,不同在于,它的分段非常小。 相对于常见的流媒体直播协议,例如RTMP协议、RTSP协议、MMS协议等,HLS直播最大的不同在于,直播客户端获取到的,并不是一个完整的数据流。HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。由此可见,基本上可以认为,HLS是以点播的技术方式来实现直播。由于数据通过HTTP协议传输,所以完全不用考虑防火墙或者代理的问题,而且分段文件的时长很短,客户端可以很快的选择和切换码率,以适应不同带宽条件下的播放。不过HLS的这种技术特点,决定了它的延迟一般总是会高于普通的流媒体直播协议。
4,5,6等等等等,其他的暂时还没遇到,跟本文也没有直接关系,等遇到了再写
介绍两个视频处理的神器:
1.ffmpeg:音视频处理神器:解码,转码,推流于一体的全能神器
2.nginx-http-flv,注意,注意,是集成了http-flv-module的nginx
下面说点干货,实现RTSP视频流无插件播放的处理过程:
1.拿到RTSP地址。
一般这个都是项目里面提供好的,测试地址网上公开的不多,好像就一只大兔子的视频,还是时不时访问不了。
自行取用:rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov
如果访问不了,我们可以通过下面介绍的ffmpeg来推流,
ffmpeg -re -i d:\mgdz3.mp4 -vcodec h264 -acodec aac -strict -2 -f rtsp -rtsp_transport tcp rtsp://localhost/test
得到的本地rtsp地址为:rtsp://localhost/test
2.程序接收处理RTSP数据流,转为RTMP
这里有两种方式:
一种可以直接拿ffmpeg来实现,或者直接拿ffmpeg推RTMP的流就可以了,这里简单带过:ffmpeg -re -i mgdz3.mp4 -vcodec copy -acodec copy -f flv rtmp://loalhost/live/01
还有一种就是通过程序解码然后推流,详见另外一篇文章:
java实现rtsp转rtmp
3.视频服务器(下面提供的nginx-http-flv)对rtmp数据流进行转码,提供http-flv地址
4.利用哔哩哔哩的开源flv.js实现前端播放,项目地址公开出来:
flvjs实现rtsp数据流无插件浏览器播放-前端
flvjs实现rtsp数据流无插件浏览器播放-后端