您的位置 首页 java

基于vlcj的rtsp实时视频流播放技术

应用场景

1. 播放 海康 或者 大华 监控的 rtsp 实时视频流。

2. 有跨多个系统平台的视频播放需求。

准备材料

1. vlcj程序包,下载地址:

2. vlc软件,下载地址:

3. rtsp视频流:海康或者大华的摄像头账号,并设置rtsp视频流为开启状态。

操作步骤(以windows系统为例)

1. 下载vlc软件;

2. 安装vlc-3.0.16-win32.exe文件到系统中,安装路径为C:\Program Files\VideoLAN\VLC;

3. 下载vlcj程序包;

4. 复制程序包中的jar包到Java项目中,将jar包添加到项目运行环境中。

5. 编写播放器实现程序;

程序实现步骤

第一步,开启vlcj的自动发现本地库。

第二步,指定加载VLC的路径。

第三步,根据摄像头参数配置,拼装rtsp协议请求字符串。

第四步,创建播放窗体。

第五步,获取vlcj的播放器,将rstp参数传入播放器,调用播放方法。

实战代码

 package cn.easthope.lk.LKClient.biz;
 
import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; 
 
import javax.swing. JFrame ; 
import javax.swing. JPanel ; 
import javax.swing.border.EmptyBorder;

import org.apache. log4j .Logger; 
import com.sun.jna.NativeLibrary;
 
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
import uk.co.caprica.vlcj.discovery.NativeDiscovery;
import uk.co.caprica.vlcj.player.MediaPlayer;
import uk.co.caprica.vlcj.runtime.RuntimeUtil;
 
/*****
 * @author chenliang
 * @date   2021.7.30
 * ****/public class VlcjPlayer {
    
     protected  Logger logger = Logger.getLogger(VlcjPlayer.class); 
    public static VlcjPlayer ins; 
    public List<EmbeddedMediaPlayerComponent> playerEmList = new ArrayList<EmbeddedMediaPlayerComponent>();
 
    public static VlcjPlayer getInstance() {
        if (ins == null) {
           ins = new VlcjPlayer();  
        }
        return ins;
    }
     
    /**
     * @Title: Rtsp Url拼装
     * @Description: url拼装
     * @param ip
     * @param username
     * @param password
     * @param channel 
     * @return
     * @return CameraPojo
     * @throws IOException
     **/    public String buildRtspUrl(String ip, String username, String password, String channel, 
                               String manufacturer) {  
        String rtsp = "";
        String stream = "main";
        String IP = ip;  
        // --------------直播流拼接地址----------------- 
        if("HK".equals(manufacturer)){
            //海康摄像头RSTP地址拼接
          //  rtsp://admin:111@127.0.0.1:554/h265/ch1/main/av_stream
            rtsp = "rtsp://" + username + ":" + password + "@" + IP + ":554/h265/ch" + channel + "/" + stream + "/av_stream"; 
        }else if("DH".equals(manufacturer)){//大华摄像头RSTP地址拼接
            //   大华  rtsp://admin:111@127.0.0.1:37777/cam/realmonitor?channel=1&subtype=0      
            stream = "main".equalsIgnoreCase(stream)?"0":"1";
            rtsp = "rtsp://" + username + ":" + password + "@" + IP + ":554/cam/realmonitor?channel=" + channel + "&subtype=" + stream;
        } 
        logger.info("--->" + rtsp);
        return rtsp;
    }
    
    public boolean initVlc() {
        
        //实例化NativeDiscovery类
        boolean found =  new NativeDiscovery().discover();
        //通过判断选择系统,Windows, Mac OS ,Liunx。以下都是各个系统的VLC默认安装路径
        if (RuntimeUtil.isWindows()) {
            NativeLibrary.addSearchPath(
                RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC");
        }else if (RuntimeUtil.isMac()) {
            NativeLibrary.addSearchPath(
                RuntimeUtil.getLibVlcLibraryName(), "/Applications/VLC.app/Contents/MacOS/lib");
        }else if (RuntimeUtil.isNix()) {
            NativeLibrary.addSearchPath(
                RuntimeUtil.getLibVlcLibraryName(), "/home/linux/vlc/install/lib");
        } 
//        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), FileUtil.DLL_PATH+"//Dll//vlc");
//        boolean found = new NativeDiscovery().discover(); 
        System.out.println(found);
        System.out.println(LibVlc.INSTANCE.libvlc_get_version()); 
        return found;
    } 
    
private VlcjPlayer() { 
}

public void showDemo() {
    JFrame frame = new JFrame("vlcDemo");

        EmbeddedMediaPlayerComponent mediaPlayerComponent = new EmbeddedMediaPlayerComponent();

        mediaPlayerComponent.setSize(980, 960);
        frame.getContentPane().setLayout(null);
        frame.add(mediaPlayerComponent);

        frame.setLocation(100, 100);
        frame.setSize(940, 824);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);


        MediaPlayer player = mediaPlayerComponent.getMediaPlayer();

        String[] options =
            {"video-filter=motionblur",  "network-caching=200", "no-plugins-cache"};

        player.playMedia("rtsp://admin:xl@123456@127.0.0.1:554/h265/ch1/main/av_stream",options);

        player.stop();

        player.start();
 
}
 
public void playBoy(JPanel contentPane,JPanel videopanel,EmbeddedMediaPlayerComponent playerComponent,String rtsp) {
  //将播放器界面添加到videopanel中,用来播放视频,并设置布局为居中
        MediaPlayer player = playerComponent.getMediaPlayer();  
        playerEmList.add(playerComponent);
       
        String[] options =
            {"video-filter=motionblur",  "network-caching=200", "no-plugins-cache"}; 
        player.playMedia(rtsp,options); 
        player.start();
        videopanel.repaint();
                
        
}
 
/***
 * 释放视频资源
 * @author chenl285
 * @date   2021.7.29
 * ***/public void release() {
    for (EmbeddedMediaPlayerComponent emp : playerEmList) {
        emp.getMediaPlayer().release(); 
        emp.release();
    }
}
 

public static void main(String[] args) {
//new VlcjPlayer().showDemo();
// 
VlcjPlayer vp =   VlcjPlayer.getInstance();
vp.initVlc();
String rtsp = "rtsp://admin:111@127.0.0.1:554/h265/ch1/main/av_stream"; 

        EmbeddedMediaPlayerComponent playerComponent = new EmbeddedMediaPlayerComponent(); 
        EmbeddedMediaPlayerComponent playerComponent2 = new EmbeddedMediaPlayerComponent(); 

        JFrame frame = new JFrame("vlcDemo");
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        frame.setBounds(100, 100, 1200, 300);
           
        JPanel contentPane;
        //创建播放器界面组件 
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new GridLayout(1, 4));
        frame.setContentPane(contentPane);
         
        JPanel videopanel = new JPanel();
        //因为playerComponent布局为边界布局,所以Jpanl布局也必须边界布局,不然只能听到声音,看不到画面
        contentPane.add(videopanel); 
        videopanel.setLayout(new BorderLayout(0, 0)); 
        videopanel.add(playerComponent, BorderLayout.CENTER);
         
        // 加载第二个视频
        JPanel videopanel2 = new JPanel();
        //因为playerComponent布局为边界布局,所以Jpanl布局也必须边界布局,不然只能听到声音,看不到画面
        contentPane.add(videopanel2); 
        videopanel2.setLayout(new BorderLayout(0, 0)); 
        videopanel2.add(playerComponent2, BorderLayout.CENTER);
        
        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {  
                vp.release();
                System.exit(0);
            }
        }); 
        // 添加第一个监控
vp.playBoy(contentPane,videopanel,playerComponent,rtsp); 
// 添加第二个监控
    vp.playBoy(contentPane,videopanel2,playerComponent2,rtsp);
 

}  

  
}
  

文章来源:智云一二三科技

文章标题:基于vlcj的rtsp实时视频流播放技术

文章地址:https://www.zhihuclub.com/185764.shtml

关于作者: 智云科技

热门文章

网站地图