基于javacv(推流),nginx(流媒体服务器),VCL(播放器)搭建直播视频

目录

1.获取RTSP地址

2.搭建流媒体服务器

2.1下载资源

下载nginx

 下载rtmp组件

 启动nginx

测试工具(由于java代码调试问题,所以这里先下载一个转码推流的工具,其中javacv的原理也是它)可忽略

 下载VLC(测试视频是否成功)

 2.2测试向流媒体服务器推流

3.转码

 4.查看监控数据状态:


最近基于摄像头搭建一个由摄像头采取RTSP流数据,并返回前端的需求。研究了一下怎么实现。

1.获取RTSP地址

摄像头厂商为:乔安智联的摄像头(其他摄像头也可以)。

通过ONVIF Device Manager软件在局域网内进行查找获取摄像头的RTSP流地址

ONVIF Device Managericon-default.png?t=N4HBhttps://sourceforge.net/projects/onvifdm/

 使用方法网上很多(这里可能会出现问题,我由于电脑问题出现反序列失败,用别人的电脑已连接就成功,目前不知道原因)

2.搭建流媒体服务器

2.1下载资源

下载nginx

首先我们要知道一般nginx不能直接配置rtmp服务,在Windows系统上需要特殊nginx版本才能进行搭建 : nginx 1.7.11.3 Gryphon.zipicon-default.png?t=N4HBhttp://nginx-win.ecsds.eu/download/

下载并解压,进入文件夹,打开cmd命令窗口。输入nginx -v。出现一下效果显示安装成功

 下载rtmp组件

由于后面需要检查监控直播状态,这里下载一个组件

nginx-rtmp-module-mastericon-default.png?t=N4HBhttps://github.com/arut/nginx-rtmp-module/解压文件到nginx目录下

 启动nginx

在conf目录下,新建文件nginx.conf

 内容:


worker_processes  1;   #Nginx进程数,建议设置为等于CPU总核数
 
events {
    worker_connections  1024;  #工作模式与连接数上限
}
 
rtmp_auto_push on;
 
 
#RTMP服务
rtmp  {
    server  {
        listen 1935;
        chunk_size 4096;
        application live  {
            live on;	#开启直播
            record off;
        }
    }
}
 
 
#HTTP服务
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
    server {  #nginx启动页面
        listen       80;
        server_name  localhost;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
 
        location /live_hls{
		    types{
			    #m3u8 type设置
				application/vnd.apple.mpegurl m3u8;
				#ts分片文件设置
				video/mp2t ts;
			}
			#指向访问m3u8文件目录
			alias ./m3u8File;
			    add_header Cache-Control no-cache; #禁止缓存
		}
 
        location /control{
		    rtmp_control all;
		}
		
		location /stat{  #映射监控工具
		    rtmp_stat all;
			rtmp_stat_stylesheet stat.xsl;
		}
		location /stat.xsl{
		    root ./nginx-rtmp-module-master;
		}
 
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

回到nginx目录,打开cmd命令行

输入start nginx命令启动nginx

在浏览器中输入localhost或是127.0.0.1检查启动是否成功(如下效果为成功)

 

测试工具(由于java代码调试问题,所以这里先下载一个转码推流的工具,其中javacv的原理也是它)可忽略

 ffmpegicon-default.png?t=N4HBhttps://ffmpeg.org/

解压并配置全局变量

 测试ffmpeg:

在文件路径下打开终端

输入ffmpeg -i .\1.png i.jpg 

 当出现一下界面并且目录中出现转码的文件,表示操作成功

 下载VLC(测试视频是否成功)

VLCicon-default.png?t=N4HBhttps://www.videolan.org/vlc/

 2.2测试向流媒体服务器推流

在命令行中输入ffmpeg -i 上传的文件名 -f flv rtmp://127.0.0.1:1935/live

-i 表示推流的文件 -f表示指定推流的协议 后面的rtmp地址根据流媒体服务器中监听的端口和应用来获取 

这里以我的1.MP4为例

ffmpeg -i .\1.mp4 -f flv rtmp:127.0.0.1:1935/live (如果之前的所有和我一样,这里的也应该是一样的)

出现下面界面 表示正在推流中

打开VCL,在媒体选项中选择打开网络串流

地址输入推流的地址

 出现视频表示推流,拉流成功

3.转码

由于目前大多数的浏览器无法直接解析RTSP流地址,所以这里选择用java作为后台转码并推流到流媒体服务器。

依赖:

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.4.3</version>
</dependency>
<dependency>
    <groupId>org.bytedeco.javacpp-presets</groupId>
    <artifactId>ffmpeg-platform</artifactId>
    <version>4.0.2-1.4.3</version>
</dependency>

java代码:

package com.example.demo.util;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

import lombok.SneakyThrows;
import org.bytedeco.javacpp.avcodec;
import org.bytedeco.javacv.*;

public class RecordVideoThread {
    public static void main(String[] args) {
        String RtspURL = "rtsp://192.168.17.88:554/live/ch00_0";// RTSP流地址(1中获取的)
        String RtmpUrl = "rtmp://127.0.0.1:1935/live/test";  //(RTMP地址)
        push(RtspURL , RtmpUrl );
    }

    public void push(String RtspURL, String RtmpUrl) {
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(RtspURL);
        FFmpegFrameRecorder recorder = null;
        try {
            //发起请求
            grabber.start();
            System.out.println("1111");
            Frame frame = grabber.grabFrame();
            if (frame != null) {
                // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
                recorder = new FFmpegFrameRecorder(RtmpUrl, 1080, 1440, 1);
                recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);// 直播流格式
                recorder.setFormat("flv");// 录制的视频格式
                recorder.setFrameRate(25);// 帧数
                //百度翻译的比特率,默认400000,但是我400000贼模糊,调成800000比较合适
                recorder.setVideoBitrate(800000);
                System.out.println("开始保存视频");
                recorder.start();
                while ((frame != null)) {
                    recorder.record(frame);// 推流
                    frame = grabber.grabFrame();// 获取下一帧
                }
                recorder.record(frame);
                // 停止录制
                recorder.stop();
                grabber.stop();
            }
        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FrameRecorder.Exception e) {
            e.printStackTrace();
        } finally {
            if (null != grabber) {
                try {
                    grabber.stop();
                } catch (FrameGrabber.Exception e) {
                    e.printStackTrace();
                }
            }
            if (recorder != null) {
                try {
                    recorder.stop();
                } catch (FrameRecorder.Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

启动项目,打开VCL,输入RTMP地址

 4.查看监控数据状态:

在浏览器输入localhost/stat

 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 搭建流媒体服务器需要以下步骤: 1. 安装Linux操作系统,建议使用Ubuntu或CentOS等常见的Linux发行版。 2. 安装流媒体服务器软件,常用的有Nginx-rtmp、Wowza、Red5等。其中,Nginx-rtmp是一个轻量级的流媒体服务器,安装简单,配置灵活,适合小型的流媒体应用;Wowza和Red5则是功能更为强大的流媒体服务器,支持更多的协议和功能。 3. 配置流媒体服务器,包括设置端口、协议、编码格式、流媒体文件存储路径等。 4. 配置流媒体客户端,如VLC、FFmpeg等,以便能够与流媒体服务器进行通信。 5. 测试流媒体服务器,可以使用本地文件或网络摄像头等设备进行测试,确保流媒体服务器正常工作。 总之,搭建流媒体服务器需要一定的技术水平和经验,建议在实践前先学习相关的知识和技术。 ### 回答2: 流媒体服务器是指一个服务器能够接收、编码、存储、和分发流媒体内容的服务器。Linux系统在搭建流媒体服务器上拥有很大优势,因为它拥有从Linux社区和开源社区获得的强大工具箱。在本文中,我们将探讨如何在Linux上搭建流媒体服务器。 第一步:安装Linux操作系统 在搭建流媒体服务器之前,我们需要先选择一个Linux操作系统。我们可以选择稳定,经过良好测试的Debian或者Ubuntu操作系统,也可以选择其他的开源操作系统。然后,我们需要执行以下步骤: 1.安装操作系统。你可以通过官方网站下载需要的系统镜像。 2.在安装过程中设置管理员的用户名和密码。 3.在安装过程中选择安装需要的软件和服务。 第二步:安装LAMP 拥有一个互联网流媒体服务器需要安装一个完整的LAMP(Linux操作系统,Apache HTTP服务,MySQL数据库,以及PHP编程语言)服务集合。在此我们将重点介绍如何搭建Apache服务以及与之相关的一些服务。 1.安装Apache服务器。你可以使用包管理工具apt或dnf来安装。 2.安装MySQL组件。MySQL允许我们在Linux操作系统上运行和存储数据库。 3.安装PHP组件。PHP是用于Web开发的编程语言,在架设流媒体服务器上有很大的用处。 第三步:安装流媒体软件 完成了第二步之后,我们现在需要安装一些流媒体服务软件。这些软件可以帮助我们在Linux操作系统上运行一个实时流媒体服务器。 1.安装Icecast。Icecast是一个开源项目,用于流媒体服务器的基础服务。 2.安装DarkIce。这是一个广泛被流媒体服务器系统使用的基础编码器。 第四步:配置流媒体软件 在安装完所需组件之后,我们需要对它们进行配置,以便流媒体服务器能够顺利的工作。下一步我们将讲述这个操作示例。 1.配置icecast。Icecast的配置文件在”/etc/icecast.xml”目录下,需要在此修改后进行保存。 2.配置DarkIce。配置DarkIce的方法可以参考相关文档等。 第五步:故障排除和调试 最后,我们需要对流媒体服务器进行故障排除和调试。如果你遇到了问题或问题无法解决,可以通过查询问题的错误日志来查出问题所在。这些错误日志可以在”/var/log或/srv/jellies目录下找到。 总结: 以上就是用Linux安装搭建流媒体服务器的大致流程。这个流程包括安装操作系统、安装LAMP、安装流媒体软件、配置流媒体软件以及故障排查等工作。需要注意的是,这些过程可能因系统版本、软件版本等影响而有所不同。因此,请仔细查阅官方文档以及相关技术博客。最后,总结一下,Linux作为开源操作系统在流媒体服务器架设上有着良好的使用体验,它对于高可靠性、高安全性处理有着卓越的表现,值得我们进一步挖掘和使用。 ### 回答3: Linux是一个开放源代码的内核,它可以为用户提供自由、强大和高度安全的操作系统。通过Linux,我们可以轻松地搭建一个高效的流媒体服务器,用于实时广播音频和视频内容。 搭建流媒体服务器的第一步是安装Linux操作系统。现在市场上有很多不同的发行版可以选择,比如Ubuntu、CentOS、Debian等等。在选择系统的同时,我们还需要确保网络配置以及系统更新等步骤完成。 接下来,我们需要安装流媒体服务器软件。我们可以选择一些流行的免费软件,比如FFmpeg、VLC或者Nginx。在这里我们以Nginx作为例子进行讲解。 Nginx是一款非常流行的服务器软件,它可以用来处理HTTP和其他网络协议。在流媒体方面,Nginx的优势在于可以快速地向多个客户端播放视频和音频。 安装Nginx非常简单,首先要做的就是打开终端,输入以下命令: sudo apt-get install nginx 安装完成后,我们需要配置Nginx流媒体服务。 第一步是创建一个RTMP块,在这里我们将定义一些RTMP流媒体的设置。打开配置文件并添加以下内容: rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; } } } 其中,listen指定RTMP服务器监听的端口号,chunk_size定义信息块的大小,live表示开启直播功能,record表示关闭录制功能。 接下来,我们需要设置Nginx服务来支持MP4格式的视频流。在server块中添加以下内容: location /videos { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; alias /var/www/html/videos/; } 其中,mp4表明本段服务支持MP4格式的视频,mp4_buffer_size和mp4_max_buffer_size用来设置视频缓冲区的大小,alias用来设置文件夹路径,即视频文件夹的路径。 完成以上配置后,我们需要重新加载Nginx服务以应用新的设置。在终端输入以下命令: sudo service nginx reload 这样就完成了一个流媒体服务器搭建。现在,我们只需要将我们的音频或视频内容上传到/var/www/html/videos/文件夹中,即可通过RTMP块和MP4服务向多个用户提供实时流媒体内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值