18600329666

咨询技术专家

扫一扫
与技术专家在线沟通

Menu
视频直播软件的技术实现方式(jwplayer+ffmpeg+red5)
       视频直播目前非常火爆,各种视频直播软件,手机APP层出不穷,深受分头的青睐。视频直播技术基于RTMP及时流协议,点播技术基于HTTP协议,RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing)和分包(packetizing)的问题。随着VR技术的发展,视频直播等领域逐渐活跃起来,RTMP作为业内广泛使用的协议也重新被相关开发者重视起来。
      一、centos系统搭建RED5流媒体服务器
  • 安装java运行环境jdk 
          yum install java-1.7.0-openjdk  ,或者编译安装
  • 下载red5
选择red5-server-1.0.6-RELEASE-server.tar.gz,解压到 /usr/local/red5
  • 设置权限与安装
          cd /usr/local/red5  
 
          chmod +x *.sh  
          ./red5.sh  
  • red5服务器配置  :修改conf下的red5.properties可以修改IP和端口,HTTP是打开Red5的Demo页面用的,RTMP是用于在直播,视频播放等流服务时候使用的协议。   
  • 端口等其他设置:打开5080、1935等端口,配置完成后,双击Red5目录下的red5.bat即可启动Red5服务器。启动完成后,输入http://192.168.7.96:5080,出现画面则表示成功。(如果不改配置文件,用http://localhost:5080即可)
二、客户端通过jwplayer播放器进行播放,下载此插件,配置较简单此处略
三、客户端FFmpeg的安装及使用
服务端:red5服务器启动,啥也不用动,最多下载个oflaDemo看看点播的效果。
客户端:jwplayer通过rtmp协议读取实时流。代码如下:
jwplayer("jwplayer_flv").setup({
file: "rtmp://192.168.1.29/oflaDemo//hello",
flashplayer: '${ctx}/resource/yulan/jwplayer.flash.swf',
image : '',
primary : 'flash',
width : '800',
height : '600',
autostart: true,
mute: false,
repeat: false
});
file: "rtmp://192.168.1.29/oflaDemo//hello"   这句话可以暂时不用管,看到后面就会知道啥意思。
流的推送:ffmpeg
推送命令:
ffmpeg -i "rtsp://admin:admin123@192.168.10.91:554/h264/ch1/main/av_stream"  -b  4096k  -f flv -r 25 -s1280x720 -an"rtmp://localhost/oflaDemo/hello"
这句话如何在Java代码里实现呢?网上很多。
java代码(下面的代码是同事给的,毕竟代码跑过一段时间,应该没啥问题):
public void liveVideo() throws Exception {
String rtspVideo = "rtsp://admin:admin123@192.168.10.91:554/h264/ch1/main/av_stream";
String rtmpVideo = "rtmp://192.168.1.29/oflaDemo/hello";
String commend = FFMPEG+"ffmpeg -i " + """ + rtspVideo + "" -b 4096k -f flv -r 25 -s 1280x720 -an " + """ + rtmpVideo + """;
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(commend);
StreamGobbler sg1 = new StreamGobbler(proc.getInputStream(), "Console");
StreamGobbler sg2 = new StreamGobbler(proc.getErrorStream(), "Error");
sg1.start();
sg2.start();
proc.waitFor();
proc.destroy();
}
public class StreamGobbler extends Thread {  
InputStream is;  
String type;  
private Logger log = Logger.getLogger(this.getClass());  
private static int i = 1;  
private static int j = 1;  
public StreamGobbler(InputStream is, String type) {  
   this.is = is;  
   this.type = type;  
}  
public StreamGobbler() {
}
public void run() {  
   try {  
       InputStreamReader isr = new InputStreamReader(is);  
       BufferedReader br = new BufferedReader(isr);  
       i++;  
       j++;  
       String line = null;  
       while ((line = br.readLine()) != null) {  
           if (type.equals("Error")) {  
//                log.error(line);
//            System.err.println(line);
           }else{  
//                log.info(line);  
//            System.out.println(line);
           }  
       }  
   } catch (IOException ioe) {  
       ioe.printStackTrace();  
   }  
}  
从代码可以看出,客户端的“file: "rtmp://192.168.1.29/oflaDemo//hello" 这段代码 和 java中"String rtmpVideo = "rtmp://192.168.1.29/oflaDemo/hello";" 这段代码就对应起来了。
不得不说,ffmpeg这个东西的确厉害。给实现直播功能省了不少事。
至此,一个直播功能就实现了。