EASYSTREAM — простой инструмент для преобразования RTSP в RTMP, HLV и HLS
Проект EASYSTREAM представляет собой фреймворк для вторичного обёртывания потоков RTSP от Hikvision Dahua и их преобразования в потоки для веб-трансляций. С помощью Nginx можно воспроизводить видео в форматах RTMP, HLV и HLS.
Проект
EASYSTREAM позволяет преобразовывать потоки RTSP от камер Hikvision Dahua в форматы, подходящие для веб-трансляции. Для трансляции на Windows был скомпилирован Nginx, который доступен для скачивания в проекте. Если вы используете Linux, вам потребуется динамическая компиляция.
Конфигурация EASYSTREAM добавляется в application.yml:
easystream:
# Соответствующий адрес сервера Nginx
push_host: 192.168.200.2
# Время жизни потока (в минутах)
keepalive: 1
# Дополнительный адрес отправки
host_extra: 127.0.0.1
# Порт отправки Nginx
push_port: 1935
# Максимальная скорость основного потока
main_code: 5120
# Максимальная скорость дополнительного потока
sub_code: 1024
# Тип потока: 1 — Invr, 2 — синтез
rtsptype: 1
# Доступный порт для видеопотока
access_port: 8085
Быстрый старт
Пример основан на Spring Boot.
Шаг 1: Добавьте зависимость Maven:
<dependency>
<groupId>com.github.xianyujava</groupId>
<artifactId>easystream-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
Шаг 2: Сканируйте интерфейсы:
В классе конфигурации или запуска Spring Boot добавьте аннотацию @EasystreamScan
.
@SpringBootApplication
@Configuration
@EasystreamScan
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
Шаг 3: Вызовите интерфейс:
Внедрите экземпляр интерфейса EasysteamService.
// Внедрение экземпляра интерфейса
@Autowired
private EasysteamService easysteamService;
...
Запуск видеопотока
/**
* CameraPojo — атрибуты сущности
* private String username = "";// Имя пользователя камеры
private String password = "";// Пароль камеры
private String ip = "";// IP-адрес камеры
private String port = "8000";
private String channel = "";// Канал камеры
private String stream = "1";// Поток камеры: 1 — основной поток, 2 — дополнительный поток
private String rtsp = "";// Возвращаемый адрес RTSP
private String rtmp = "";// Возвращаемый адрес RTMP
private String url = "";// Возвращаемый URL для HLV
private String startTime = "";// Время начала воспроизведения при воспроизведении
private String endTime = "";// Время окончания воспроизведения при воспроизведении
private String openTime = "";// Открытое время
private int count = 0;// Количество пользователей по умолчанию
private String token = "";// Для прямой трансляции и воспроизведения требуется уникальный идентификатор
private String hls = "";// Возвращённый URL для HLS
private String type="";// По умолчанию пусто для синтеза видео, 0:nvr, 1:ipc
********************************************
Параметры метода должны быть установлены следующим образом:
username = "";// Имя пользователя камеры
password = "";// Пароль камеры
ip = "";// IP-адрес камеры
port = "8000";
channel = "";// Канал камеры
token = "";// Уникальный идентификатор для прямой трансляции и воспроизведения
type="";// По умолчанию пусто для синтеза видео, 0:nvr, 1:ipc
********************************************
При открытии потока воспроизведения необходимо передать:
startTime = "";// Начало времени воспроизведения
endTime = "";// Конец времени воспроизведения
********************************************
Метод возвращает результат в виде строки JSON CameraPojo, включая URL воспроизведения:
rtsp = "";// Адрес RTSP
rtmp = "";// Адрес RTMP
url = "";// URL для HLV
hls = "";//URL для HLS
*/
String result = easysteamService.openCamera(CameraPojo pojo);
Завершение прямой трансляции видеопотока
/**
* tokens — токены для открытия видеопотока, разделенные запятыми; например, 1,3
*/
String result = easysteamService.closeCamera(String tokens);
Завершение воспроизведения видеопотока
/**
* tokens — токены для открытия видеопотока, разделённые запятыми; например, 1,3
*/
String result = easysteamService.closeHistoryCamera(String tokens);
Поддержание активности видеопотока, иначе он будет остановлен после тайм-аута
/**
* tokens — токены для открытия видеопотока, разделённые запятыми; например, 1,3
*/
String result = easysteamService.keepAlive(String tokens);
Поддержание активности воспроизведения видеопотока, иначе оно будет остановлено после тайм-аута
/**
* tokens — токены для открытия видеопотока, разделённые запятыми; например, 1,3
*/
String result = easysteamService.keepPlayBackAlive(String tokens);
Пример передней страницы (здесь используется библиотека flv.js)
<script src="../../lib/media/flv1.5.js"></script>
<video id="video_3" autoplay="autoplay" height="100%" width="100%"></video>
function playvidoe(param, timer,id) {
$.ajax({
type: 'POST',
url: '/nslcloud/rtmp/cameras',
dataType: 'json',
data: {
'ip': param.videoip,
'port': param.videoport,
'username':
``` ```
param.username,
'password': param.password,
'channel': param.monitortdh,
'type': param.type,
'token': param.videoid,
'kcdm' : param.kcdm
},
success: function (json) {
//json=JSON.parse(json)
//alert(json.url);
var ieversion = IEVersion();
if (json.url != '') {
//if (flvjs.isSupported()) {
if (ieversion == 99) {
var videoElement = document.getElementById('video_' + id);
var flvPlayer = flvjs.createPlayer({
type: 'flv',
//height:'1040px',
url: json.url
});
flvPlayer.attachMediaElement(videoElement);
flvPlayer.load();
flvPlayer.play();
//flvid[id] = flvPlayer;
flvid.put(id, flvPlayer);
kcdms.put(id,param);
} else {
videojs('video_' + id).ready(
function () {
//alert("1111");
var myPlayer5 = this;
myPlayer5.src({type: "rtmp/flv", src: json.rtmp});
myPlayer5.load(json.rtmp);
//myPlayer5.src({type: "rtmp/flv", src: json.hls});
//myPlayer5.load(json.hls);
myPlayer5.play();
this.on('play', function () {//开始播放
//flvid[id] = myPlayer5;
flvid.put(id, myPlayer5);
kcdms.put(id,param);
});
}
);
}
var interval = setInterval(function () {
$.ajax({
type: 'POST',
url: '/nslcloud/rtmp/keepAlive',
dataType: 'json',
traditional: true,//这里设置为true
headers: {
'Authorization': sessionStorage.getItem('Authorization')
},
data: {
'tokens': param.videoid,
'kcdm' : param.kcdm
}, success: function (json) {
}
});
}, 10000, 3000);
if (timer.containsKey(id)) {
clearInterval(timer.get(id));
timer.remove(id);
}
//timer[id] = interval;
timer.put(id, interval);
// }
} else {
alert("无视频源!");
}
},
error: function (data) {
alert("请求错误!");
}
});
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )