摄像头的直播

研究了几天,终于把直播功能做完了,顿时心里压力少了许多。

起初,买了本视频直播的书,看了一下,好麻烦,不知道从何做起。看有没有简便的方法能够实现直播功能。要想通过简便的方法实现,就必须要了解直播的原理。

思路:通过硬件(比如摄像头,我这使用的是海康的摄像头)采集视频数据(视频编码是标准的视频编码H264),把视频流推送到red5服务器(我用的red5服务器,你也可以使用nginx服务器,都一样),在通过rtmp协议把推送到服务器的视频流读取过来,再本地实现播放(我用的jwplayer播放器进行播放,如何你想自己写客户端,可以通过actionscript语言去完成)

总结一下就是:如何通过jwplayer播放器播放推送到red5服务器的实时流。

有了思路,如何实现:

1、red5服务器先搭建起来,太简单了,此处不再赘述。

2、客户端通过jwplayer播放器进行播放,下载此插件。网上一搜,一大推。

剩下的问题就是,如何把摄像头的实时流推送到服务器。继续网上搜,搜到了ffmpeg这个工具。这个工具就可以实现推流。

3、下载ffmpeg.exe

一切准备就绪,就剩下代码的实现。

服务端: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:[email protected]: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:[email protected]: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这个东西的确厉害。给实现直播功能省了不少事。

至此,一个直播功能就实现了。

说明:这只是我个人对直播理解,有些可能不对,我也是才看了几天,理解上肯定有些偏颇。各位大牛勿喷啊。小弟心脏不好。如有问题,可评论,吐槽。
 

猜你喜欢

转载自blog.csdn.net/m0_37346206/article/details/89421468