diff --git a/README.md b/README.md index 5d1d9c3e..f5c5eda3 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ A beta channel is available on [Google Play](https://play.google.com/apps/intern ## Features -- **Video:** RTSP playback, hardware H.264/H.265 decoding via MediaCodec -- **Audio:** AAC (RFC 3640 `mpeg4-generic`, ADTS, MP4A-LATM), Opus, G.711 μ-law/A-law, L16 PCM (mono/stereo) -- **Display:** single camera, or Quad mode with up to 8 cameras at once (2×2 or 3×3 grid) +- **Video:** RTSP playback, hardware H.264/H.265 decoding via MediaCodec, automatic decoder recovery, picture fitted to any screen shape +- **Audio:** AAC (RFC 3640 `mpeg4-generic`, ADTS, MP4A-LATM), Opus, G.711 μ-law/A-law, L16 PCM (mono/stereo); in multi-view, the sound of the selected cell +- **Display:** single camera, or multi-view (Quad) with up to 8 cameras at once in a 2×2 or 3×3 grid - **Controls:** pinch-to-zoom, pan, double-tap to reset, Android TV remote (Leanback launcher) - **Network:** Basic and Digest authentication, RTSP keepalive, automatic reconnection with exponential back-off, connection-quality indicator - **WebUI:** built-in browser for the camera's web interface -- **More:** long-press screenshot, 8 camera slots, URLs can be shared from other apps +- **More:** 8 camera slots, URLs stored encrypted, long-press screenshot, URLs can be shared from other apps ## Requirements @@ -47,7 +47,7 @@ A beta channel is available on [Google Play](https://play.google.com/apps/intern 1. Install the APK from the [latest release](https://github.com/OpenIPC/decoder/releases/tag/latest) and launch the app. 2. Tap the screen, or press **OK** on a remote, to open the menu. -3. Choose a camera number (**1**–**4**), then press **Settings** and enter the camera URL: +3. Choose a camera number (**1**–**8**), then press **Settings** and enter the camera URL: ``` rtsp://username:password@ip_address:554/stream=0 ``` @@ -59,7 +59,7 @@ A beta channel is available on [Google Play](https://play.google.com/apps/intern | Item | Action | |--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Q** | Turn Quad mode on or off | +| **Q** | Turn multi-view (Quad) on or off | | **1**–**8** | Switch to a camera slot. The active slot's number shows the connection quality: green under 100 ms of jitter, yellow 100–300 ms, red above 300 ms. A grey number is an empty slot. | | **Settings** | Edit the RTSP URL of the active slot (single-camera mode only) | | **WebUI** | Open the camera's web interface; credentials come from the RTSP URL (single-camera mode only) | @@ -67,29 +67,29 @@ A beta channel is available on [Google Play](https://play.google.com/apps/intern ### Gestures and keys -| Input | Action | -|--------------------------|-----------------------------------------| -| Tap / **OK** / **Enter** | Open or close the menu | -| **Back** / **Esc** | Close the menu | -| Pinch, then drag | Zoom (up to 5×) and pan | -| Double tap | Reset zoom | -| Long press | Save a screenshot to `Pictures/OpenIPC` | +| Input | Action | +|--------------------------|------------------------------------------------------------------------------------------| +| Tap / **OK** / **Enter** | Open or close the menu | +| **Back** / **Esc** | Close the menu | +| Pinch, then drag | Zoom (up to 5×) and pan, single view | +| Double tap | Reset zoom | +| Long press | Single view: save a screenshot to `Pictures/OpenIPC`. Multi-view: play this cell's sound | ### Opening a camera from another app The app accepts plain-text shares (`ACTION_SEND`, `text/plain`). Sharing an `rtsp://` URL from another app, for example OpenIPC Network, puts it into the active slot. -### Quad mode +### Multi-view (Quad) Shows the configured slots in a 2×2 grid, or in a 3×3 grid once any of slots 5–8 is used. Each cell has its own connection and decoder, so the device's video decoder limits how many high-resolution streams play smoothly: with five or more cameras, their substreams are a good choice. Some cameras accept only one RTSP client at a time. Long-press a cell to play its audio (long-press it again to mute); the selected cell shows an AUDIO badge and is remembered. Tap any cell to open the menu. ## Known limitations > [!IMPORTANT] -> These are known gaps that we plan to address. Each one has an issue — comments, test results and pull requests are welcome. +> Each item has an issue — comments, test results and pull requests are welcome. > -> - **RTSP over TCP only.** No UDP or multicast — [#7](https://github.com/OpenIPC/decoder/issues/7) -> - **G.726 audio is not supported** — [#14](https://github.com/OpenIPC/decoder/issues/14) +> - **RTSP over TCP only.** No UDP or multicast yet — [#7](https://github.com/OpenIPC/decoder/issues/7) +> - **G.726 audio and MP4A-LATM with in-band configuration (`cpresent=1`) are not supported.** OpenIPC Majestic does not use them, and cameras that offer G.726 can usually send G.711 or AAC instead — [#14](https://github.com/OpenIPC/decoder/issues/14) > - **Credentials are sent in clear text** over plain RTSP/HTTP (Basic auth unless the camera asks for Digest); RTSPS is not supported and not planned — [#16](https://github.com/OpenIPC/decoder/issues/16) > > Known bugs are tracked separately under the [`bug` label](https://github.com/OpenIPC/decoder/issues?q=is%3Aissue+is%3Aopen+label%3Abug). @@ -128,16 +128,20 @@ Debug and release builds are signed with different keys. To switch from one to t ## Architecture -| Class | Role | -|-------------------------------|-------------------------------------------------------------------------| -| `Decoder` | Main activity: UI, lifecycle, settings, video decode thread | -| `RtspClient` | RTSP handshake, RTP-over-TCP receive loop, watchdog, SDP parsing | -| `NalAssembler` | Rebuilds H.264/H.265 NAL units from RTP fragmentation units | -| `MediaCodecManager` | Hardware video decoder lifecycle | -| `AudioManager`, `AudioConfig` | Audio pipeline: G.711/L16 conversion, AAC decoding, AudioTrack playback | -| `QuadCell` | A self-contained stream (network, watchdog, decoder) for one Quad cell | -| `MenuManager` | Popup menu, URL editor, WebUI browser | -| `FramePool` | Buffer pool that reduces garbage-collector load | +| Class | Role | +|-------------------------------------|------------------------------------------------------------------------------------------------------| +| `Decoder` | Main activity: UI, lifecycle, settings, single-view video decoding, multi-view grid | +| `RtspClient` | Single-view stream: RTSP session, NAL assembly, audio, connection quality | +| `RtspSession` | One RTSP-over-TCP session: handshake, RTP receive loop, keepalive, watchdog, reconnect with back-off | +| `RtspAuth`, `Sdp` | Basic and Digest authentication; parsing of the camera's session description | +| `NalAssembler` | Rebuilds H.264/H.265 NAL units from RTP packets, drops units damaged by packet loss | +| `MediaCodecManager`, `DecoderRetry` | Hardware video decoder lifecycle and recovery after decoder errors | +| `AudioManager`, `AudioConfig` | Audio pipeline: G.711/L16 conversion, AAC/Opus decoding, AudioTrack playback | +| `QuadCell` | One multi-view cell: its own session, decoder and optional audio | +| `MenuManager` | Popup menu, URL editor, WebUI browser | +| `CredentialStore`, `KeystoreCipher` | Encrypted storage of camera URLs (Android Keystore) | +| `FramePool`, `Frame` | Buffer pool that reduces garbage-collector load | +| `App`, `Crash` | Uncaught-exception handler and crash report screen | Network, video decoding and audio run on separate threads, so a slow decoder never blocks the socket. @@ -153,38 +157,39 @@ Tested the app on your device? Please [**submit a Device report**](https://githu ### Verified devices -The devices below were reported with the legacy 1.0x version (`basic` branch). New reports should include the app version. - -| Type | Device | Android | Kernel | App | Notes | -|-------------|----------------------------------------|-----------------------------------|----------------|------|----------------------------------------------------------------------| -| Phone | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | | -| Phone | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | | -| Phone | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | | -| Phone | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | | -| Phone | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | | -| Phone | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | | -| Phone | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | | -| Phone | Samsung A55 5G | 14 | 6.1.93 | 1.0x | | -| Phone | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | | -| Phone | Samsung S8 | 9 | 4.4.153 | 1.0x | | -| Phone | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | | -| Phone | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | | -| Phone | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | | -| Phone | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | | -| Tablet | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | Picture cropped, [#17](https://github.com/OpenIPC/decoder/issues/17) | -| Tablet | Lenovo TB-X606F | 10 | — | 1.0x | Picture cropped, [#17](https://github.com/OpenIPC/decoder/issues/17) | -| Tablet | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | Picture cropped, [#17](https://github.com/OpenIPC/decoder/issues/17) | -| Tablet | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | | -| Tablet | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | | -| Tablet | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | | -| Set-top box | A95X F3 AIR | 9 (SlimBOXtv AOSP 9.14, no GAPPS) | 4.9.113 | 1.0x | | -| Set-top box | IE X3 Air | 9 (SlimBOXtv AOSP 9.14, no GAPPS) | 4.9.113 | 1.0x | | -| Set-top box | SberBox SBDV-00001 | custom | 4.9.228 | 1.0x | | -| Set-top box | X96Q (Allwinner H313) | 10 | 4.9.170 | 1.0x | | -| TV | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | No icon in the device's app list | -| TV | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | | -| Car | Media Center JCAC10003 (ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | | -| Car | Mirror Z55 | 8.1.0 | 4.4.83 | 1.0x | | +Most devices below were reported with the legacy 1.0x version (`basic` branch); the *App* column shows the version that was tested. New reports should include the app version. + +| Type | Device | Android | Kernel | App | Notes | +|-------------|----------------------------------------|-----------------------------------|----------------|---------|--------------------------------------------------------------------------------------------| +| Phone | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | | +| Phone | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | | +| Phone | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | | +| Phone | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | | +| Phone | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | | +| Phone | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | | +| Phone | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | | +| Phone | Samsung A55 5G | 14 | 6.1.93 | 1.0x | | +| Phone | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | | +| Phone | Samsung S8 | 9 | 4.4.153 | 1.0x | | +| Phone | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | | +| Phone | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | | +| Phone | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | | +| Phone | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | | +| Tablet | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | Picture cropped in 1.0x, fixed in v2 ([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| Tablet | Lenovo TB-X606F | 10 | — | 1.0x | Picture cropped in 1.0x, fixed in v2 ([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| Tablet | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | Picture cropped in 1.0x, fixed in v2 ([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| Tablet | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | | +| Tablet | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | | +| Tablet | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | | +| Set-top box | A95X F3 AIR | 9 (SlimBOXtv AOSP 9.14, no GAPPS) | 4.9.113 | 1.0x | | +| Set-top box | IE X3 Air | 9 (SlimBOXtv AOSP 9.14, no GAPPS) | 4.9.113 | 1.0x | | +| Set-top box | AG-216 | 10 | 4.9.170 | v2 1.28 | v2 test device: 8-camera multi-view, H.264/H.265, Opus/AAC/L16 | +| Set-top box | SberBox SBDV-00001 | custom | 4.9.228 | 1.0x | | +| Set-top box | X96Q (Allwinner H313) | 10 | 4.9.170 | 1.0x | | +| TV | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | No icon in the device's app list | +| TV | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | | +| Car | Media Center JCAC10003 (ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | | +| Car | Mirror Z55 | 8.1.0 | 4.4.83 | 1.0x | | ### Not working diff --git a/README.ru.md b/README.ru.md index 96a2adcd..7a73ab36 100644 --- a/README.ru.md +++ b/README.ru.md @@ -29,13 +29,13 @@ ## Возможности -- **Видео:** воспроизведение RTSP, аппаратное декодирование H.264/H.265 через MediaCodec -- **Звук:** AAC (RFC 3640 `mpeg4-generic`, ADTS, MP4A-LATM), Opus, G.711 μ-law/A-law, L16 PCM (моно и стерео) -- **Режимы:** одна камера или Quad — до 8 камер на одном экране (сетка 2×2 или 3×3) +- **Видео:** воспроизведение RTSP, аппаратное декодирование H.264/H.265 через MediaCodec, автоматическое восстановление декодера, картинка вписывается в экран любой формы +- **Звук:** AAC (RFC 3640 `mpeg4-generic`, ADTS, MP4A-LATM), Opus, G.711 μ-law/A-law, L16 PCM (моно и стерео); в мультивиде — звук выбранной ячейки +- **Режимы:** одна камера или мультивид (Quad) — до 8 камер на одном экране, сеткой 2×2 или 3×3 - **Управление:** масштаб двумя пальцами, перемещение, сброс двойным касанием, пульт Android TV (Leanback) - **Сеть:** авторизация Basic и Digest, RTSP keepalive, автоматическое переподключение с растущей задержкой, индикатор качества связи - **WebUI:** встроенный браузер для веб-интерфейса камеры -- **Прочее:** скриншот долгим нажатием, 8 слотов для камер, приём ссылок из других приложений +- **Прочее:** 8 слотов для камер, адреса хранятся в зашифрованном виде, скриншот долгим нажатием, приём ссылок из других приложений ## Требования @@ -47,7 +47,7 @@ 1. Установите APK из [релиза latest](https://github.com/OpenIPC/decoder/releases/tag/latest) и запустите приложение. 2. Коснитесь экрана или нажмите **OK** на пульте, чтобы открыть меню. -3. Выберите номер камеры (**1**–**4**), нажмите **Settings** и введите адрес камеры: +3. Выберите номер камеры (**1**–**8**), нажмите **Settings** и введите адрес камеры: ``` rtsp://username:password@ip_address:554/stream=0 ``` @@ -59,7 +59,7 @@ | Пункт | Действие | |--------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| **Q** | Включить или выключить режим Quad | +| **Q** | Включить или выключить мультивид (Quad) | | **1**–**8** | Переключиться на слот камеры. Цвет номера активного слота показывает качество связи: зелёный — джиттер меньше 100 мс, жёлтый — 100–300 мс, красный — больше 300 мс. Серый номер — пустой слот. | | **Settings** | Изменить RTSP-адрес активного слота (только в режиме одной камеры) | | **WebUI** | Открыть веб-интерфейс камеры; логин и пароль берутся из RTSP-адреса (только в режиме одной камеры) | @@ -67,29 +67,29 @@ ### Жесты и кнопки -| Ввод | Действие | -|------------------------------|-----------------------------------------| -| Касание / **OK** / **Enter** | Открыть или закрыть меню | -| **Back** / **Esc** | Закрыть меню | -| Щипок, затем перетаскивание | Увеличение (до 5×) и перемещение | -| Двойное касание | Сбросить масштаб | -| Долгое нажатие | Сохранить скриншот в `Pictures/OpenIPC` | +| Ввод | Действие | +|------------------------------|-------------------------------------------------------------------------| +| Касание / **OK** / **Enter** | Открыть или закрыть меню | +| **Back** / **Esc** | Закрыть меню | +| Щипок, затем перетаскивание | Увеличение (до 5×) и перемещение, в режиме одной камеры | +| Двойное касание | Сбросить масштаб | +| Долгое нажатие | Одна камера: скриншот в `Pictures/OpenIPC`. Мультивид: звук этой ячейки | ### Открытие камеры из другого приложения Приложение принимает текст через «Поделиться» (`ACTION_SEND`, `text/plain`). Если поделиться ссылкой `rtsp://` из другого приложения, например из OpenIPC Network, она запишется в активный слот. -### Режим Quad +### Мультивид (Quad) Показывает настроенные слоты сеткой 2×2, а если занят хотя бы один из слотов 5–8 — сеткой 3×3. У каждой ячейки своё подключение и свой декодер, поэтому число плавно идущих потоков высокого разрешения ограничено видеодекодером устройства: для пяти и более камер лучше брать их дополнительные потоки (substream). Некоторые камеры допускают только одно RTSP-подключение одновременно. Долгое нажатие на ячейку включает её звук (повторное — выключает); у выбранной ячейки виден значок AUDIO, выбор запоминается. Коснитесь любой ячейки, чтобы открыть меню. ## Известные ограничения > [!IMPORTANT] -> Это известные пробелы, которые мы планируем закрыть. На каждый заведён issue — комментарии, результаты проверок и pull request приветствуются. +> На каждый пункт заведён issue — комментарии, результаты проверок и pull request приветствуются. > -> - **Только RTSP поверх TCP.** UDP и multicast не поддерживаются — [#7](https://github.com/OpenIPC/decoder/issues/7) -> - **Не поддерживается звук G.726** — [#14](https://github.com/OpenIPC/decoder/issues/14) +> - **Только RTSP поверх TCP.** UDP и multicast пока не поддерживаются — [#7](https://github.com/OpenIPC/decoder/issues/7) +> - **Не поддерживаются звук G.726 и MP4A-LATM с конфигурацией внутри потока (`cpresent=1`).** OpenIPC Majestic их не использует, а камеры с G.726 обычно умеют отдавать G.711 или AAC — [#14](https://github.com/OpenIPC/decoder/issues/14) > - **Логин и пароль передаются в открытом виде** по RTSP/HTTP без шифрования (Basic, если камера не запросила Digest); RTSPS не поддерживается и не планируется — [#16](https://github.com/OpenIPC/decoder/issues/16) > > Известные ошибки собраны отдельно, под [меткой `bug`](https://github.com/OpenIPC/decoder/issues?q=is%3Aissue+is%3Aopen+label%3Abug). @@ -128,16 +128,20 @@ export KEY_PASS=your_key_password ## Архитектура -| Класс | Назначение | -|-------------------------------|-----------------------------------------------------------------------------------| -| `Decoder` | Главная activity: интерфейс, жизненный цикл, настройки, поток декодирования видео | -| `RtspClient` | RTSP-рукопожатие, приём RTP поверх TCP, сторожевой таймер, разбор SDP | -| `NalAssembler` | Сборка NAL-блоков H.264/H.265 из RTP-фрагментов | -| `MediaCodecManager` | Жизненный цикл аппаратного видеодекодера | -| `AudioManager`, `AudioConfig` | Звук: преобразование G.711/L16, декодирование AAC, вывод через AudioTrack | -| `QuadCell` | Независимый поток (сеть, сторожевой таймер, декодер) для одной ячейки Quad | -| `MenuManager` | Всплывающее меню, редактор адреса, браузер WebUI | -| `FramePool` | Пул буферов, снижает нагрузку на сборщик мусора | +| Класс | Назначение | +|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------| +| `Decoder` | Главная activity: интерфейс, жизненный цикл, настройки, декодирование видео одной камеры, сетка мультивида | +| `RtspClient` | Поток одной камеры: RTSP-сессия, сборка NAL, звук, качество связи | +| `RtspSession` | Одна RTSP-сессия поверх TCP: рукопожатие, приём RTP, keepalive, сторожевой таймер, переподключение с растущей задержкой | +| `RtspAuth`, `Sdp` | Авторизация Basic и Digest; разбор описания сессии камеры | +| `NalAssembler` | Сборка NAL-блоков H.264/H.265 из RTP-пакетов, отбрасывание блоков, повреждённых потерями | +| `MediaCodecManager`, `DecoderRetry` | Жизненный цикл аппаратного видеодекодера и восстановление после ошибок | +| `AudioManager`, `AudioConfig` | Звук: преобразование G.711/L16, декодирование AAC/Opus, вывод через AudioTrack | +| `QuadCell` | Одна ячейка мультивида: своя сессия, декодер и звук по выбору | +| `MenuManager` | Всплывающее меню, редактор адреса, браузер WebUI | +| `CredentialStore`, `KeystoreCipher` | Зашифрованное хранение адресов камер (Android Keystore) | +| `FramePool`, `Frame` | Пул буферов, снижает нагрузку на сборщик мусора | +| `App`, `Crash` | Обработчик необработанных исключений и экран отчёта о сбое | Сеть, декодирование видео и звук работают в отдельных потоках, поэтому медленный декодер не блокирует сокет. @@ -153,38 +157,39 @@ export KEY_PASS=your_key_password ### Проверенные устройства -Отчёты ниже получены для старой версии 1.0x (ветка `basic`). В новых отчётах указывайте версию приложения. - -| Тип | Устройство | Android | Ядро | Версия | Примечание | -|--------------|--------------------------------------|------------------------------------|----------------|--------|---------------------------------------------------------------------------| -| Телефон | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | | -| Телефон | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | | -| Телефон | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | | -| Телефон | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | | -| Телефон | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | | -| Телефон | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | | -| Телефон | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | | -| Телефон | Samsung A55 5G | 14 | 6.1.93 | 1.0x | | -| Телефон | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | | -| Телефон | Samsung S8 | 9 | 4.4.153 | 1.0x | | -| Телефон | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | | -| Телефон | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | | -| Телефон | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | | -| Телефон | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | | -| Планшет | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | Изображение обрезано, [#17](https://github.com/OpenIPC/decoder/issues/17) | -| Планшет | Lenovo TB-X606F | 10 | — | 1.0x | Изображение обрезано, [#17](https://github.com/OpenIPC/decoder/issues/17) | -| Планшет | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | Изображение обрезано, [#17](https://github.com/OpenIPC/decoder/issues/17) | -| Планшет | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | | -| Планшет | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | | -| Планшет | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | | -| ТВ-приставка | A95X F3 AIR | 9 (SlimBOXtv AOSP 9.14, без GAPPS) | 4.9.113 | 1.0x | | -| ТВ-приставка | IE X3 Air | 9 (SlimBOXtv AOSP 9.14, без GAPPS) | 4.9.113 | 1.0x | | -| ТВ-приставка | SberBox SBDV-00001 | своя | 4.9.228 | 1.0x | | -| ТВ-приставка | X96Q (Allwinner H313) | 10 | 4.9.170 | 1.0x | | -| Телевизор | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | Нет значка в списке приложений | -| Телевизор | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | | -| Авто | Медиацентр JCAC10003 (ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | | -| Авто | Зеркало Z55 | 8.1.0 | 4.4.83 | 1.0x | | +Большинство отчётов ниже получено для старой версии 1.0x (ветка `basic`); в столбце *Версия* указано, какая версия проверялась. В новых отчётах указывайте версию приложения. + +| Тип | Устройство | Android | Ядро | Версия | Примечание | +|--------------|--------------------------------------|------------------------------------|----------------|---------|----------------------------------------------------------------------------------------------------| +| Телефон | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | | +| Телефон | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | | +| Телефон | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | | +| Телефон | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | | +| Телефон | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | | +| Телефон | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | | +| Телефон | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | | +| Телефон | Samsung A55 5G | 14 | 6.1.93 | 1.0x | | +| Телефон | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | | +| Телефон | Samsung S8 | 9 | 4.4.153 | 1.0x | | +| Телефон | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | | +| Телефон | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | | +| Телефон | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | | +| Телефон | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | | +| Планшет | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | Изображение обрезано в 1.0x, исправлено в v2 ([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| Планшет | Lenovo TB-X606F | 10 | — | 1.0x | Изображение обрезано в 1.0x, исправлено в v2 ([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| Планшет | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | Изображение обрезано в 1.0x, исправлено в v2 ([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| Планшет | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | | +| Планшет | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | | +| Планшет | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | | +| ТВ-приставка | A95X F3 AIR | 9 (SlimBOXtv AOSP 9.14, без GAPPS) | 4.9.113 | 1.0x | | +| ТВ-приставка | IE X3 Air | 9 (SlimBOXtv AOSP 9.14, без GAPPS) | 4.9.113 | 1.0x | | +| ТВ-приставка | AG-216 | 10 | 4.9.170 | v2 1.28 | Тестовое устройство v2: мультивид на 8 камер, H.264/H.265, Opus/AAC/L16 | +| ТВ-приставка | SberBox SBDV-00001 | своя | 4.9.228 | 1.0x | | +| ТВ-приставка | X96Q (Allwinner H313) | 10 | 4.9.170 | 1.0x | | +| Телевизор | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | Нет значка в списке приложений | +| Телевизор | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | | +| Авто | Медиацентр JCAC10003 (ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | | +| Авто | Зеркало Z55 | 8.1.0 | 4.4.83 | 1.0x | | ### Не работает diff --git a/README.zh-CN.md b/README.zh-CN.md index 454fed5e..34c8bd11 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -29,13 +29,13 @@ ## 功能 -- **视频:** RTSP 播放,通过 MediaCodec 进行 H.264/H.265 硬件解码 -- **音频:** AAC(RFC 3640 `mpeg4-generic`、ADTS、MP4A-LATM)、Opus、G.711 μ-law/A-law、L16 PCM(单声道/立体声) -- **显示:** 单路画面,或 Quad 多画面(最多同时显示 8 路摄像机,2×2 或 3×3 网格) +- **视频:** RTSP 播放,通过 MediaCodec 进行 H.264/H.265 硬件解码,解码器出错后自动恢复,画面适配任意屏幕比例 +- **音频:** AAC(RFC 3640 `mpeg4-generic`、ADTS、MP4A-LATM)、Opus、G.711 μ-law/A-law、L16 PCM(单声道/立体声);多画面模式下播放所选画面的声音 +- **显示:** 单路画面,或多画面模式(Quad),以 2×2 或 3×3 网格最多同时显示 8 路摄像机 - **操作:** 双指缩放、拖动平移、双击复位,支持 Android TV 遥控器(Leanback 启动器) - **网络:** 支持 Basic 和 Digest 认证、RTSP 保活,断线后自动重连(指数退避),连接质量指示 - **WebUI:** 内置浏览器,可打开摄像机的网页管理界面 -- **其他:** 长按截图,8 个摄像机槽位,可接收其他应用分享的地址 +- **其他:** 8 个摄像机槽位,地址加密保存,长按截图,可接收其他应用分享的地址 ## 系统要求 @@ -47,7 +47,7 @@ 1. 从 [latest 发布页](https://github.com/OpenIPC/decoder/releases/tag/latest)安装 APK 并启动应用。 2. 点击屏幕或按遥控器上的 **OK** 键打开菜单。 -3. 选择摄像机编号(**1**–**4**),点击 **Settings** 并输入摄像机地址: +3. 选择摄像机编号(**1**–**8**),点击 **Settings** 并输入摄像机地址: ``` rtsp://username:password@ip_address:554/stream=0 ``` @@ -59,7 +59,7 @@ | 菜单项 | 功能 | |--------------|-----------------------------------------------------------------------------------------------------------------------------------------------| -| **Q** | 开启或关闭 Quad 四分屏模式 | +| **Q** | 开启或关闭多画面模式(Quad) | | **1**–**8** | 切换摄像机槽位。当前槽位编号的颜色表示连接质量:绿色为抖动低于 100 毫秒,黄色为 100–300 毫秒,红色为高于 300 毫秒。灰色编号表示该槽位未配置。 | | **Settings** | 编辑当前槽位的 RTSP 地址(仅单路模式) | | **WebUI** | 打开摄像机网页界面,用户名和密码取自 RTSP 地址(仅单路模式) | @@ -67,29 +67,29 @@ ### 手势与按键 -| 输入 | 功能 | -|---------------------------|---------------------------------| -| 点击 / **OK** / **Enter** | 打开或关闭菜单 | -| **Back** / **Esc** | 关闭菜单 | -| 双指捏合后拖动 | 缩放(最大 5 倍)并平移 | -| 双击 | 恢复原始大小 | -| 长按 | 截图并保存到 `Pictures/OpenIPC` | +| 输入 | 功能 | +|---------------------------|---------------------------------------------------------------------| +| 点击 / **OK** / **Enter** | 打开或关闭菜单 | +| **Back** / **Esc** | 关闭菜单 | +| 双指捏合后拖动 | 缩放(最大 5 倍)并平移,仅单路画面 | +| 双击 | 恢复原始大小 | +| 长按 | 单路画面:截图并保存到 `Pictures/OpenIPC`。多画面:播放该画面的声音 | ### 从其他应用打开摄像机 应用可接收纯文本分享(`ACTION_SEND`,`text/plain`)。从其他应用(例如 OpenIPC Network)分享 `rtsp://` 地址后,该地址会写入当前槽位。 -### Quad 四分屏模式 +### 多画面模式(Quad) 以 2×2 网格显示已配置的槽位;只要使用了第 5–8 个槽位中的任意一个,就改为 3×3 网格。每个画面都有独立的连接和解码器,因此能流畅播放多少路高分辨率码流取决于设备的视频解码器:五路及以上时建议使用摄像机的子码流。部分摄像机同一时间只允许一个 RTSP 客户端。长按某个画面即可播放其声音(再次长按则静音);被选中的画面显示 AUDIO 标记,选择会被记住。点击任意画面即可打开菜单。 ## 已知限制 > [!IMPORTANT] -> 以下是我们计划解决的已知不足,每一项都有对应的 issue。欢迎留言、提交测试结果和 pull request。 +> 每一项都有对应的 issue。欢迎留言、提交测试结果和 pull request。 > -> - **仅支持 RTSP over TCP**,不支持 UDP 和组播 — [#7](https://github.com/OpenIPC/decoder/issues/7) -> - **不支持 G.726 音频** — [#14](https://github.com/OpenIPC/decoder/issues/14) +> - **仅支持 RTSP over TCP**,暂不支持 UDP 和组播 — [#7](https://github.com/OpenIPC/decoder/issues/7) +> - **不支持 G.726 音频,也不支持流内配置的 MP4A-LATM(`cpresent=1`)。** OpenIPC Majestic 不使用这些格式,支持 G.726 的摄像机通常也能输出 G.711 或 AAC — [#14](https://github.com/OpenIPC/decoder/issues/14) > - **用户名和密码以明文传输**(未加密的 RTSP/HTTP;摄像机未要求 Digest 时发送 Basic),不支持 RTSPS,也不计划支持 — [#16](https://github.com/OpenIPC/decoder/issues/16) > > 已知的程序错误另行收录在 [`bug` 标签](https://github.com/OpenIPC/decoder/issues?q=is%3Aissue+is%3Aopen+label%3Abug)下。 @@ -128,16 +128,20 @@ export KEY_PASS=your_key_password ## 架构 -| 类 | 作用 | -|-------------------------------|----------------------------------------------------------| -| `Decoder` | 主 Activity:界面、生命周期、设置、视频解码线程 | -| `RtspClient` | RTSP 握手、RTP over TCP 接收循环、看门狗、SDP 解析 | -| `NalAssembler` | 将 RTP 分片重组为 H.264/H.265 NAL 单元 | -| `MediaCodecManager` | 硬件视频解码器的生命周期管理 | -| `AudioManager`、`AudioConfig` | 音频处理:G.711/L16 转换、AAC 解码、通过 AudioTrack 播放 | -| `QuadCell` | Quad 模式中单个画面的独立数据流(网络、看门狗、解码器) | -| `MenuManager` | 弹出菜单、地址编辑器、WebUI 浏览器 | -| `FramePool` | 缓冲区池,减轻垃圾回收压力 | +| 类 | 作用 | +|-------------------------------------|-----------------------------------------------------------------| +| `Decoder` | 主 Activity:界面、生命周期、设置、单路视频解码、多画面网格 | +| `RtspClient` | 单路数据流:RTSP 会话、NAL 重组、音频、连接质量 | +| `RtspSession` | 单个 RTSP over TCP 会话:握手、RTP 接收、保活、看门狗、退避重连 | +| `RtspAuth`、`Sdp` | Basic 与 Digest 认证;解析摄像机的会话描述 | +| `NalAssembler` | 将 RTP 包重组为 H.264/H.265 NAL 单元,丢弃因丢包而损坏的单元 | +| `MediaCodecManager`、`DecoderRetry` | 硬件视频解码器的生命周期管理与出错后的恢复 | +| `AudioManager`、`AudioConfig` | 音频处理:G.711/L16 转换、AAC/Opus 解码、通过 AudioTrack 播放 | +| `QuadCell` | 多画面中的单个画面:独立的会话、解码器和可选音频 | +| `MenuManager` | 弹出菜单、地址编辑器、WebUI 浏览器 | +| `CredentialStore`、`KeystoreCipher` | 摄像机地址加密存储(Android Keystore) | +| `FramePool`、`Frame` | 缓冲区池,减轻垃圾回收压力 | +| `App`、`Crash` | 未捕获异常处理与崩溃报告界面 | 网络、视频解码和音频分别运行在独立线程中,解码器较慢时也不会阻塞网络读取。 @@ -153,38 +157,39 @@ export KEY_PASS=your_key_password ### 已验证设备 -以下设备的报告基于旧版 1.0x(`basic` 分支)。新报告请注明应用版本。 - -| 类型 | 设备 | Android | 内核 | 版本 | 备注 | -|----------|---------------------------------------|------------------------------------|----------------|------|---------------------------------------------------------------------| -| 手机 | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | | -| 手机 | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | | -| 手机 | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | | -| 手机 | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | | -| 手机 | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | | -| 手机 | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | | -| 手机 | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | | -| 手机 | Samsung A55 5G | 14 | 6.1.93 | 1.0x | | -| 手机 | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | | -| 手机 | Samsung S8 | 9 | 4.4.153 | 1.0x | | -| 手机 | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | | -| 手机 | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | | -| 手机 | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | | -| 手机 | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | | -| 平板 | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | 画面边缘被裁切,[#17](https://github.com/OpenIPC/decoder/issues/17) | -| 平板 | Lenovo TB-X606F | 10 | — | 1.0x | 画面边缘被裁切,[#17](https://github.com/OpenIPC/decoder/issues/17) | -| 平板 | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | 画面边缘被裁切,[#17](https://github.com/OpenIPC/decoder/issues/17) | -| 平板 | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | | -| 平板 | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | | -| 平板 | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | | -| 电视盒子 | A95X F3 AIR | 9(SlimBOXtv AOSP 9.14,无 GAPPS) | 4.9.113 | 1.0x | | -| 电视盒子 | IE X3 Air | 9(SlimBOXtv AOSP 9.14,无 GAPPS) | 4.9.113 | 1.0x | | -| 电视盒子 | SberBox SBDV-00001 | 定制系统 | 4.9.228 | 1.0x | | -| 电视盒子 | X96Q(全志 H313) | 10 | 4.9.170 | 1.0x | | -| 电视 | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | 应用列表中没有图标 | -| 电视 | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | | -| 车载 | 多媒体主机 JCAC10003(ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | | -| 车载 | 后视镜 Z55 | 8.1.0 | 4.4.83 | 1.0x | | +以下大多数设备的报告基于旧版 1.0x(`basic` 分支);“版本”一列为实际测试的版本。新报告请注明应用版本。 + +| 类型 | 设备 | Android | 内核 | 版本 | 备注 | +|----------|---------------------------------------|------------------------------------|----------------|---------|-----------------------------------------------------------------------------------------| +| 手机 | Asus ZC553KL | 8.1 | 3.18.71 | 1.0x | | +| 手机 | Blackview BV4900Pro | 12 | 4.19.191 | 1.0x | | +| 手机 | Oppo 5X | ColorOS 15.0 | 5.15.149 | 1.0x | | +| 手机 | Oppo A17 | ColorOS 12.1 | 4.19.191 | 1.0x | | +| 手机 | Samsung Galaxy A51 | 13 | 4.14.113 | 1.0x | | +| 手机 | Samsung Galaxy M21 (SM-M215F/DSN) | 12 | 4.14.113 | 1.0x | | +| 手机 | Samsung Galaxy S25 | 15 | 6.6.30 | 1.0x | | +| 手机 | Samsung A55 5G | 14 | 6.1.93 | 1.0x | | +| 手机 | Samsung Galaxy J7 | 10 | 3.18.150 | 1.0x | | +| 手机 | Samsung S8 | 9 | 4.4.153 | 1.0x | | +| 手机 | Samsung S23 Ultra | 15 | 5.15.153 | 1.0x | | +| 手机 | Xiaomi Redmi 7A | 10 | 4.9.261 | 1.0x | | +| 手机 | Xiaomi Redmi Note 7 (M1901F7G) | 10 | 4.4.192 | 1.0x | | +| 手机 | Xiaomi Redmi Note 13 4G | 13 | 5.15.94 | 1.0x | | +| 平板 | Lenovo TB-X304L | 8.1.0 | 3.18.71 | 1.0x | 1.0x 中画面边缘被裁切,v2 已修复([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| 平板 | Lenovo TB-X606F | 10 | — | 1.0x | 1.0x 中画面边缘被裁切,v2 已修复([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| 平板 | Lenovo Tab P11 | 11 | 4.19.157-perf+ | 1.0x | 1.0x 中画面边缘被裁切,v2 已修复([#17](https://github.com/OpenIPC/decoder/issues/17)) | +| 平板 | Samsung Galaxy Tab A | 7.1.1 | 3.10.49 | 1.0x | | +| 平板 | Samsung Galaxy Tab A | 11 | 4.9.227 | 1.0x | | +| 平板 | Samsung Tab A7 (SM-T505) | 12 | 4.19.157-perf- | 1.0x | | +| 电视盒子 | A95X F3 AIR | 9(SlimBOXtv AOSP 9.14,无 GAPPS) | 4.9.113 | 1.0x | | +| 电视盒子 | IE X3 Air | 9(SlimBOXtv AOSP 9.14,无 GAPPS) | 4.9.113 | 1.0x | | +| 电视盒子 | AG-216 | 10 | 4.9.170 | v2 1.28 | v2 测试设备:8 路多画面,H.264/H.265,Opus/AAC/L16 | +| 电视盒子 | SberBox SBDV-00001 | 定制系统 | 4.9.228 | 1.0x | | +| 电视盒子 | X96Q(全志 H313) | 10 | 4.9.170 | 1.0x | | +| 电视 | Haier Candy Android TV 2K | 11 | 4.9.243+ | 1.0x | 应用列表中没有图标 | +| 电视 | Yandex TV Novex NVX-55U169TSY | 7.1.1 | 4.4.3 | 1.0x | | +| 车载 | 多媒体主机 JCAC10003(ac8227/ac8229) | 12 | 3.18.79+ | 1.0x | | +| 车载 | 后视镜 Z55 | 8.1.0 | 4.4.83 | 1.0x | | ### 无法使用