Видеотрансляционный сервер, реализованный на основе протокола JT/T 1078. Когда сервер устройства передает сообщение управления потоком аудио-видео (0x9101), автомобильное устройство подключается к этому серверу и отправляет видеопоток с камеры. Сервер принимает и декодирует аудио-видео данные, обеспечивая транслирование.
Кроме того, этот проект позволяет одновременно выводить поток на RTMP-сервер после конфигурирования пути к ffmpeg и rtmp-url, что обеспечивает воспроизведение видео на мобильных устройствах (учитывайте, что производительность снижается из-за использования ffmpeg как отдельного процесса).
Благодарю 孤峰赏月/hx(github/jelycom) за предоставление поддержки mp3-аудио.
Изначально проект содержал четыре ветви различных реализаций. Все остальные ветви были удалены, так как они больше не используются. После конфигурирования ffmpeg и rtmp можно попробовать вывести поток на HLS и другие системы.
Для разработчиков на других языках рекомендую "JTT/1 Yöntem ve Protokol Geliştirme Kılavuzu", где я подробно описываю ошибки и недочеты официальной документации, чтобы помочь вам избежать проблем.
Проект принимает аудио-видео данные от автомобильного устройства, видео сразу упаковывается в FLV-TAG, аудио преобразуется из G.711A, G.711U, ADPCMA, G726 в PCM и затем сжимается в MP3 перед упаковкой в FLV-TAG.
На данный момент большинство терминалов используют h264 как основной кодировщик видео, поэтому упаковка в FLV является простой задачей. Некоторые производители используют AVS, но мне еще не приходилось встречаться с этим. В этом проекте поддерживаются только h264-кодировщики видео.
Аудио кодировка | Поддерживается | Примечания |
---|---|---|
G.711A | Да | Поддерживается |
G.711U | Да | Поддерживается |
ADPCMA | Да | Поддерживается |
G.726 | Да | Поддерживается |
Существует множество аудио кодировок, однако доступно мало устройств для тестирования. Наиболее распространенными являются G.711A и ADPCMA. Для неподдерживаемых аудио кодировок используется статическое звуковое оформление.
Наследование и реализация абстрактных методов класса AudioCodec
, позволяющее выполнять преобразование любого аудио в PCM кодировку. Добавьте также метод AudioCodec.getCodec()
. Пример абстрактного класса AudioCodec
представлен ниже:
public abstract class AudioCodec {
// Преобразование в PCM
public abstract byte[] toPCM(byte[] data);
// Преобразование из PCM в текущий кодировщик, может быть пустым
public abstract byte[] fromPCM(byte[] data);
}
В проекте есть тестовый скрипт (src/main/java/cn/org/hentai/jtt1078/test/VideoPushTest.java
) и тестовый файл данных (src/main/resources/tcpdump.bin
). Этот файл данных представляет собой пакеты аудио-видео данных, полученные с помощью специального инструмента. Тестовый скрипт может постоянно отправлять данные из файла, имитируя процесс отправки видеопотока.
Кроме того, был добавлен класс cn.org.hentai.jtt1078.test.RTPGenerate
, который читает bin-файл, модифицирует номер SIM-карты и канал, создавая большое количество тестовых файлов для нагрузочных тестов.
app.properties
.cn.org.hentai.jtt1078.app.VideoServerApp
) или сборка проекта командами mvn package
и java -jar jtt1078-video-server-1.0-SNAPSHOT.jar
.VideoPushTest.java
для начала имитации отправки видеопотока.Установлена тестовая среда на моем VPS, используя код из ветки flv. Вы можете направлять аудио-видео данные вашего терминала на этот сервер или использовать netcat для создания симулированных данных.
Заголовок | Описание |
---|---|
1078 аудио-видео сервер | 185.251.248.4:10780 |
Страница реального времени аудио-видео | http://1078.hentai.org.cn/test/multimedia#SIM-CHANNEL |
tcpdump.bin
в директории /src/main/resources/
содержит аудио-видео данные, полученные с помощью пакетного анализа. Команда cat tcpdump.bin | pv -L 40k -q | nc 185.251.248.4 10780
позволяет отправлять данные на сервер со скоростью 40 kBPS.Поскольку IP-адрес сервера может меняться, рекомендуется проверить актуальный IP-адрес командой
ping www.hentai.org.cn
.
│ ├── 1078.png (иконка)
│ └── ffmpeg.png
├── LICENSE (лицензия открытого исходного кода)
├── pom.xml
├── README.md (описание проекта)
├── src
│ └── main
│ ├── java
│ │ └── cn
│ │ └── org
│ │ └── hentai
│ │ └── jtt1078
│ │ ├── app
│ │ │ └── VideoServerApp.java (основной входящий программный модуль)
│ │ ├── codec
│ │ │ ├── ADPCMCodec.java (ADPCM кодировщик и декодировщик)
│ │ │ ├── AudioCodec.java (абстрактный родительский класс аудио кодировщиков и декодировщиков)
│ │ │ ├── G711Codec.java (G711A/alaw кодировщик и декодировщик)
│ │ │ ├── G711UCodec.java (G711U/ulaw кодировщик и декодировщик)
│ │ │ ├── g726 (реализация кодировщиков и декодировщиков G726)
│ │ │ │ ├── G726_16.java
│ │ │ │ ├── G726_24.java
│ │ │ │ ├── G726_32.java
│ │ │ │ ├── G726_40.java
│ │ │ │ ├── G726.java
│ │ │ │ └── G726State.java
│ │ │ ├── G726Codec.java (G726 кодировщик и декодировщик)
│ │ │ ├── MP3Encoder.java (PCM до MP3 компрессионный кодировщик)
│ │ │ └── SilenceCodec.java (статический декодировщик звука)
│ │ ├── entity
│ │ │ ├── Audio.java
│ │ │ ├── MediaEncoding.java
│ │ │ ├── Media.java
│ │ │ └── Video.java
│ │ ├── flv
│ │ │ ├── AudioTag.java
│ │ │ ├── FlvAudioTagEncoder.java
│ │ │ ├── FlvEncoder.java (H264 до FLV упаковочный кодировщик)
│ │ │ └── FlvTag.java
│ │ ├── http (внутренний HTTP-сервер, предоставляющий поддержку HTTP-CHUNKED передачи)
│ │ │ ├── GeneralResponseWriter.java
│ │ │ └── NettyHttpServerHandler.java
│ │ ├── publisher
│ │ │ ├── Channel.java (один канал один экземпляр Channel, Subscriber подписывает аудио и видео на канале)
│ │ │ └── PublishManager.java (управление каналами и подписчиками)
│ │ ├── server (ответственный за прием и декодирование 1078 RTP сообщений)
│ │ │ ├── Jtt1078Decoder.java
│ │ │ ├── Jtt1078Handler.java
│ │ │ ├── Jtt1078MessageDecoder.java
│ │ │ └── Session.java
│ │ ├── subscriber
│ │ │ ├── RTMPPublisher.java (реализация передачи http-flv через ffmpeg подпроцесс на RTMP сервер)
│ │ │ ├── Subscriber.java (абстрактный класс подписчика)
│ │ │ └── VideoSubscriber.java (видео подписчик)
│ │ ├── test (тестовые модули)
│ │ │ ├── AudioTest.java
│ │ │ ├── ChannelTest.java
│ │ │ ├── FuckTest.java
│ │ │ ├── G711ATest.java
│ │ │ ├── MP3Test.java
│ │ │ ├── RTPGenerate.java (генератор тестовых данных путем чтения исходных сообщений данных, создание N новых файлов с измененным номером SIM-карты, для нагрузочных тестов)
│ │ │ ├── VideoPushTest.java
│ │ │ ├── VideoServer.java
│ │ │ └── WAVTest.java
│ │ └── util
│ │ ├── ByteBufUtils.java
│ │ ├── ByteHolder.java
│ │ ├── ByteUtils.java
│ │ ├── Configs.java
│ │ ├── FileUtils.java
│ │ ├── FLVUtils.java
│ │ ├── Packet.java
│ │ └── WAVUtils.java
│ └── resources
│ ├── app.properties (основной конфигурационный файл)
│ ├── audio.html
│ ├── g726
│ │ ├── in_16.g726
│ │ ├── in_24.g726
│ │ ├── in_32.g726
│ │ └── in_40.g726
│ ├── log4j.properties
│ ├── multimedia.html (тестовая страница для воспроизведения аудио-видео)
│ ├── tcpdump.bin (тестовый файл данных, аудио ADPCM с головками HiSilicon, видео H264)
│ ├── nginx_sample.conf (пример конфигурации NGINX для обратного прокси, решение проблемы шести параллельных соединений)
│ ├── test.html
│ └── video.html
Проект собирается командой mvn package, которая создает jar-файл. Запуск осуществляется командой java -jar jtt1078-video-server-1.0-SNAPSHOT.jar
. Лучше всего иметь файлы app.properties
и multimedia.html
в одном каталоге, поскольку проект предпочитает считывать конфигурацию из локальных файлов. Если нет необходимости в локальном тестировании, файл multimedia.html
можно не использовать.
Начальный вариант этого проекта был простым демонстрационным примером. После открытия исходного кода и создания QQ группы для общения он получил значительную помощь и поддержку со стороны единомышленников. За это мы выражаем благодарность. Проект еще находится в процессе совершенствования, и мы рады приветствовать новых друзей, чтобы вместе создать более мощную платформу для мониторинга видео.
Мы хотели бы выразить особую благодарность следующим пользователям за их помощь и поддержку, а также всем другим участникам, которые помогли нам:
Проект | URL | Автор | Описание |
---|---|---|---|
JT1078 | https://github.com/yedajiang44/JT1078 | SmallChi/yedajiang44 | C#, поддерживает аудио/видео, передача flv через websocket на фронтенд |
QQ группа: 808432702, присоединяйтесь к нам! В группе вас ждут активные единомышленники, связанные материалы, тестовые данные, код и множество других решений.
Открытый исходный код требует усилий. Поддержите меня, купив сигареты "Фубинго".
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )