基于 VLC、vlcj的页面视频播放

作者:huang_jue

项目背景:公司使用海康摄像头对生产环节进行监控。

项目要求:从海康获取RTSP视频流,要求能在网页上播放,且能进行拖动进度条。

项目第一套方案:基于nginx-rtmp-module、javaCV、video.js的页面视频播放

项目第一套方案因现如今前端vue大行其道,原生js较为乏力,且nginx-rtmp-module服务器较不稳定。所以研究出第二套方案。

实现思路:利用VLC软件+vlcj(java调用vlc的api包)对RTSP流转码成HTTP视频流,直接页面播放。

比第一套方案优化了        1、不需要搭建服务器    2、前端页面不需要额外引入js,video标签直接支持http,可扩展性大大增强

实现步骤:

        1、引入vlcj

        <dependency>
            <groupId>uk.co.caprica</groupId>
            <artifactId>vlcj</artifactId>
            <version>3.12.1</version>
        </dependency>

        2、下载vlc  注意(软件版本需对应电脑系统-------32-32,64-64)。下载之后在安装目录中,把3个文件放入java项目中。

基于 VLC、vlcj的页面视频播放

libvlc.dll   libvlccore.dll   plugins

        3、利用vlcj调用vlc,将rtsp转换成http

    /** VLC安装目录 */
    private static final String NATIVE_LIBRARY_SEARCH_PATH = "C:\\Program Files\\VideoLAN\\VLC";
    public static void main(String[] args) {
        /**
         * 加载VLC
         */
        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), NATIVE_LIBRARY_SEARCH_PATH);
        System.out.println(LibVlc.INSTANCE.libvlc_get_version());
        NativeLibrary.addSearchPath(RuntimeUtil.getLibVlcLibraryName(), "C:\\Program Files\\VideoLAN\\VLC\\sdk\\lib"); 
        Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(),LibVlc.class); 

        // RTSP地址
        String mrl = new RtspMrl().host("192.168.1.xx").port(8080).path("/s?dev=xxxxx").value();
        // 输出的HTTP地址
        String options = formatHttpStream("127.0.0.1", 5555, "test");

        MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
        HeadlessMediaPlayer mediaPlayer = mediaPlayerFactory.newHeadlessMediaPlayer();

        // 进行转换
        mediaPlayer.playMedia(mrl, options);

        // 挂起
        try {
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description: 转换HTTP输出地址 
     * @param serverAddress    IP地址
     * @param serverPort    端口号
     * @param id    标识,以免多个流混淆
     * @return
     * @author: HSH_*e 
     * @createTime: 2019年3月30日 下午2:59:41
     */
    private static String formatHttpStream(String serverAddress, int serverPort, String id) 
    {
        StringBuilder sb = new StringBuilder(60);
        sb.append(":sout=#transcode{vcodec=theo,vb=2200,scale=1,acodec=vorb,ab=32,channels=2,samplerate=44100} :duplicate{dst=std{access=http,mux=ogg,");
        sb.append("dst=");
        sb.append(serverAddress);
        sb.append(':');
        sb.append(serverPort);
        sb.append("/");
        sb.append(id);
        sb.append("}}");
        return sb.toString();
    }