【Java+ffmpeg+Node-media-server+nginx】实现B/S结构项目的浏览器端RTMP播放

1 篇文章 0 订阅
1 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

随着浏览器版本升级,新版本的浏览器都已经不在支持Flash插件,所以浏览器端无法直接对RTMP协议的流进行解析并播放,需要通过一些其它手段解决浏览器端RTMP流的播放问题。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是ffmpeg

FFmpeg是一个用于处理数字音频和视频的开源工具库。它提供了录制、转换、流化音视频以及后期处理的完整解决方案,具有很高的质量和可移植性。FFmpeg 包含了非常先进的音频/视频编解码库 libavcodec,其中很多 codec 都是从头开发的,以确保高可移植性和编解码质量。它支持多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等。FFmpeg 框架提供了多种丰富的插件模块,包括封装与解封装的插件、编码与解码的插件等。它适用于多种操作系统,包括 Linux、Windows、Mac OSX 等。此外,FFmpeg 的编解码库还可以使用 GPU加速,以提高处理速度和效率。

二、什么是Node-media-server

Node-Media-Server 是一个 Node.js 实现的 RTMP/HTTP/WebSocket/HLS/DASH 流媒体服务器。
特性:
跨平台支持 Windows/Linux/Unix
支持的音视频编码 H.264/H.265/AAC/SPEEX/NELLYMOSER
支持缓存最近一个关键帧间隔数据,实现 RTMP 协议秒开
支持 RTMP 直播流转 LIVE-HTTP/WS-FLV 流,支持 NodePlayer.js 播放
支持星域 CDN 风格的鉴权
支持事件回调
支持 https/wss 加密传输
支持服务器和流媒体信息统计
支持 RTMP 直播流转 HLS,DASH 直播流
支持 RTMP 直播流录制为 MP4 文件并开启 faststart
支持 RTMP/RTSP 中继
支持 API 控制中继
支持实时多分辨率转码

三、准备工具

(1)ffmpeg.exe
(2)Node-media-server
(3)nginx_1.7.11.3_Gryphon

三、实例

1.Java调用ffmpeg进行推流

Java对ffmpeg的调用可以通过cmd命令的方式进行调用,此处以将本地视频文件进行推流为例讲解,接摄像头只需要对命令进行更换即可,只提供思路,具体调用实现方式,代码如下:

/**
 * ffmpeg进行hls推流
 * @param resourceSrc 资源地址(本地资源)
 * @param ffmpegurl ffmpeg.exe存放地址
 * @param livepath hls 为索引文件地址(需与Nginx配置文件的索引存放地址一致),rtmp为rtmp://localhost:8899/hls2/(此地址为Nginx代理的rtmp协议地址)
 * @param playName 流名称
 * @param type 类型hls/rtmp
 */
public static void hlsPush(String resourceSrc,String ffmpegurl,String livepath,String playName,String type) {
		    	String all = "cmd /c start /b ffmpeg  -re -i "+resourceSrc+" -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -ac 1 -f "+type+" "+livepath+playName;
		        String line =null;
		        StringBuilder sb = new StringBuilder();
		        Runtime runtime = Runtime.getRuntime();
		        try {
		            System.out.println(all);
		            java.lang.Process process = runtime.exec(all,null,new File(ffmpegurl));
		            InputStream errorStream = process.getErrorStream();
		            InputStream inputStream = process.getInputStream();
		            runComm(errorStream);
		            runComm(inputStream);
		            try {
		            	process.waitFor();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
		        } catch (IOException e) {
		            e.printStackTrace();
		        }
				
 }
/**
	 * rtmp推流
	 * @param ffmpegUrl ffmpeg工具路径
	 * @param input 输入(拟推流本地文件地址)
	 * @param output 输出
	 * @return
	 */
	public static boolean pushRtmpLive(String ffmpegUrl,String input,String output) {
    	String allcom = "cmd /c start /b ffmpeg -re -i "+input+" -vcodec libx264 -acodec aac -ar 44100 -f flv "+output;
        String line =null;
        StringBuilder sb = new StringBuilder();
        Runtime runtime = Runtime.getRuntime();
        try {
            System.out.println(allcom);
            java.lang.Process process1 = runtime.exec(allcom,null,new File(ffmpegUrl));
            InputStream errorStream = process1.getErrorStream();
            InputStream inputStream = process1.getInputStream();
            runComm(errorStream);
            runComm(inputStream);
            try {
            	process1.waitFor();
			} catch (InterruptedException e) {
				e.printStackTrace();
				return false;
			}
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

2.Nginx配置

HLS推流在Nginx中的nginx.conf配置文件中的http下添加如下:

location /hls2 {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            alias d:/tmp/hls2;
            expires -1;
			add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
            add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
        }

TRMP 推流在Nginx的配置文件中添加如下配置:

rtmp {
    server {
        listen 1935;#监听端口,若被占用,可以更改
        chunk_size 4000;#上传flv文件块儿的大小
        application live { #创建一个叫live的应用
             live on;#开启live的应用
             allow publish 127.0.0.1;#
             allow play all;
        }
    }
}

添加完成后启动Nginx,到这里前端已经可以对HLS协议的推流进行处理播放了,HLS协议的流支持移动端的浏览器和App的播放器进行播放;RTMP协议的流因不能直接在web播放器处理,所以处理RTMP的流还需要再进行一次处理,处理成浏览器播放器支持的协议格式,需要使用Node-media-server流媒体服务处理。

3.Node-media-server配置

安装node环境,使用npm命令下载流媒体服务,具体命令如下:

npm install node-media-server

下载完成后找到node-media-server对应的文件夹,在文件夹中找到app.js,对文件进行修改,具体如下:

const NodeMediaServer= require('node-media-server');
const config = {    
			rtmp: {        
			port: 1935,        
			chunk_size: 60000,        
			gop_cache: true,        
			ping: 60,        
			ping_timeout: 30    
			},    
			http: {        
			port: 10010,        
			allow_origin: '*',    
}}; 
var nms = new NodeMediaServer(config);
nms.run(); 

配置RTMP的端口以及HTTP的端口,配置完成后运行流媒体服务。

4.编辑流媒体服务启动脚本

流媒体服务的启动需要用到命令,可以将命令放入批处理脚本中,这样不用每次启动都输入命令行了就,可以在流媒体服务app.js文件所在位置新建txt文件,然年在txt文件中输入命令,具体命令行如下:

@echo off
node app.js


@pause

输入后保存,然后修改文件名称为自己方便辨识的名称,修改文件后缀TXT为bat,保存,这样每次启动直接双击.bat文件即可。
到这里,RTMP的服务端处理就完成了,前端可以通过HTTP来调用了,而不是通过RTMP。

总结

1.准备工具ffmpeg.exe、node-media-server、Nginx、node
2.编辑Java代码通过cmd命令调用ffmpeg
3.配置Nginx服务的配置
4.配置node-media-server
5.前端调用
这里就不在对前端调用进行描述了,主要写一下服务端怎么处理HLS和RTMP的播放问题,前端只是换一个协议,相关代码网上很多,博主不是专业技术开发人员,写的比较简单,也不太适合没有开发经验的小伙伴,可能写的很low,望各位大佬见谅!也希望看到本文觉得能看懂,能解决自己问题的小伙伴给个关注或小赞,谢谢!
另一篇技术分享文章也希望能对大家有用:基于Java FX的Java窗口应用简单实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值