提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、什么是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 {