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

文章目录
  • 前言
  • 一、什么是ffmpeg
  • 二、什么是Node-media-server
  • 三、准备工具
  • 三、实例
  • 1.Java调用ffmpeg进行推流
  • 2.Nginx配置
  • 3.Node-media-server配置
  • 4.编辑流媒体服务启动脚本
  • 总结

前言

随着浏览器版本升级,新版本的浏览器都已经不在支持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 {