基于 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项目中。
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_HuangJue
* @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();
}