摄像头的直播
作者:互联网
研究了几天,终于把直播功能做完了,顿时心里压力少了许多。
起初,买了本视频直播的书,看了一下,好麻烦,不知道从何做起。看有没有简便的方法能够实现直播功能。要想通过简便的方法实现,就必须要了解直播的原理。
思路:通过硬件(比如摄像头,我这使用的是海康的摄像头)采集视频数据(视频编码是标准的视频编码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: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这个东西的确厉害。给实现直播功能省了不少事。
至此,一个直播功能就实现了。
说明:这只是我个人对直播理解,有些可能不对,我也是才看了几天,理解上肯定有些偏颇。各位大牛勿喷啊。小弟心脏不好。如有问题,可评论,吐槽。
标签:StreamGobbler,String,192.168,oflaDemo,直播,rtmp,jwplayer,摄像头 来源: https://blog.csdn.net/m0_37346206/article/details/89421468