[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93039":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":9,"totalLinesOfCode":9,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":9,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":19,"hasPages":19,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":28,"readmeContent":29,"aiSummary":30,"trendingCount":16,"starSnapshotCount":16,"syncStatus":31,"lastSyncTime":32,"discoverSource":33},93039,"android-ip-camera","DigitallyRefined\u002Fandroid-ip-camera","DigitallyRefined","An Android MJPEG \u002F H.264 IP Camera app",null,"https:\u002F\u002Fgithub.com\u002FDigitallyRefined\u002Fandroid-ip-camera","Kotlin",203,34,5,4,0,7,42.33,false,"main",[22,23,24,25,26,27],"android","android-kotlin","camera","camerax","ip-camera","kotlin","2026-07-22 04:02:08","# Android IP Camera\n\n[![downloads](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002FDigitallyRefined\u002Fandroid-ip-camera\u002Ftotal.svg)](https:\u002F\u002Fgithub.com\u002FDigitallyRefined\u002Fandroid-ip-camera\u002Freleases)\n[![downloads](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fdownloads\u002FDigitallyRefined\u002Fandroid-ip-camera\u002Flatest\u002Ftotal.svg)](https:\u002F\u002Fgithub.com\u002FDigitallyRefined\u002Fandroid-ip-camera\u002Freleases)\n\nAn Android MJPEG \u002F H.264 IP Camera app\n\n![Desktop Browser](screenshot.webp)\n\n## Install\n\n\u003Cdiv align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FDigitallyRefined\u002Fandroid-ip-camera\u002Freleases\">\n\u003Cimg src=\"https:\u002F\u002Fuser-images.githubusercontent.com\u002F69304392\u002F148696068-0cfea65d-b18f-4685-82b5-329a330b1c0d.png\"\nalt=\"Get it on GitHub\" align=\"center\" height=\"70\" \u002F>\u003C\u002Fa>\n\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FImranR98\u002FObtainium\" target=\"_blank\">\n\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FImranR98\u002FObtainium\u002Frefs\u002Fheads\u002Fmain\u002Fassets\u002Fgraphics\u002Fbadge_obtainium.png\"\nalt=\"Get it on Obtainium\" align=\"center\" height=\"70\" \u002F>\u003C\u002Fa>\n\n\u003Ca href=\"https:\u002F\u002Ff-droid.org\u002Fen\u002Fpackages\u002Fcom.github.digitallyrefined.androidipcamera\u002F\" target=\"_blank\">\n\u003Cimg src=\"https:\u002F\u002Ff-droid.org\u002Fbadge\u002Fget-it-on.png\"\nalt=\"Get it on F-Droid\" align=\"center\" height=\"70\" \u002F>\u003C\u002Fa>\n\u003C\u002Fdiv>\n\n## Features\n\n* 🌎 Built in server, just open the video stream in a web browser, video app or even set it as a Home Assistant MJPEG IP Camera (using `https:\u002F\u002F[ip_address]:4444\u002Fvideo\u002Fmjpeg`)\n* 📴 Option to turn the display off while streaming\n* 🤳 Switch between the main or selfie camera\n* 🎛️ Remote web interface with controls for camera section, image rotation, audio\u002Fvideo sync, flash light toggle, resolution, zoom, exposure and contrast\n* 🖼️ Choose between different image quality settings and frame rates (to help reduce phone over heating)\n* 🛂 Username and password protection\n* 🔐 Automatic TLS certificate support to protect stream and login details via HTTPS\n\n## ⚠️ Warning\n\nIf you are planning to run this 24\u002F7, please make sure that your phone does not stay at 100% charge. Doing so may damage the battery and cause it to swell up, which could cause it to explode.\n\nSome models include an option to only charge to 80%, make sure this is enabled where possible.\n\nNote: running at a higher image quality may cause some phones to over heat, which can also damage the battery.\n\n## Server URL Paths & Remote Control API\n\nWhen the streaming server is running (default port `4444`, via `https:\u002F\u002F` or `http:\u002F\u002F` depending on TLS configuration), you can access the following endpoints:\n\n### 📺 Streams and Interfaces\n\n* **Web Control Panel (`\u002F`)**\n  * **Usage:** Open `https:\u002F\u002F[ip_address]:[port]\u002F` (or `http:\u002F\u002F...`) in any web browser.\n  * **Description:** Serves the built-in control panel, which plays the rear or front camera video stream and allows muting\u002Funmuting audio. Remote controls include: camera section, image rotation, flash light toggle, resolution, zoom, exposure and contrast.\n* **Motion JPEG Video Stream (`\u002Fvideo\u002Fmjpeg`)**\n  * **Usage:** Open directly in a web browser or configure in external home automation tools (e.g. Home Assistant MJPEG IP Camera).\n  * **Format:** `multipart\u002Fx-mixed-replace; boundary=frame`\n* **Raw H.264 Video Stream (`\u002Fvideo\u002Fh264`)**\n  * **Usage:** Play in media players that support raw Annex-B H.264 stream demuxing.\n    * **VLC:** Run `vlc https:\u002F\u002F[ip_address]:[port]\u002Fvideo\u002Fh264` (may require ignoring TLS validation if self-signed).\n    * **MPV:** Run `mpv https:\u002F\u002F[ip_address]:[port]\u002Fvideo\u002Fh264 --demuxer-lavf-format=h264`\n* **Live Audio Stream (`\u002Faudio`)**\n  * **Usage:** Listen to the live microphone audio.\n  * **Format:** `audio\u002Fwav` chunked transfer-encoding (WAV container, 16-bit PCM mono, 44.1kHz).\n    * **VLC\u002FMPV:** Run `vlc https:\u002F\u002F[ip_address]:[port]\u002Faudio` or `mpv https:\u002F\u002F[ip_address]:[port]\u002Faudio`.\n* **Still Snapshot (`\u002Fvideo\u002Fsnapshot`)**\n  * **Usage:** Fetch a single high-resolution image.\n  * **Format:** `image\u002Fjpeg`\n  * **Query Parameter:** `?camera=\u003Cid|front|back|toggle>` to query a specific camera sensor.\n    * *Example:* `https:\u002F\u002F[ip_address]:[port]\u002Fvideo\u002Fsnapshot?camera=back`\n* **Device Info and Capabilities JSON (`\u002Finfo.json`)**\n  * **Usage:** Query available camera sensors, their supported resolutions, device battery percentage, Wi-Fi signal strength and individual camera len settings.\n  * **Format:** `application\u002Fjson`\n\n### 🎛️ Remote Control Commands\n\nSettings can be changed dynamically by passing query parameters in HTTP GET requests (e.g., to the root path `\u002F` or any control endpoint).\n\n* **Parameters:**\n  * `camera=\u003Cid|front|back|toggle>`: Switches the active camera sensor (supports logical:physical ids).\n  * `resolution=\u003Clow|medium|high|auto|max|WxH>`: Change capture\u002Fstream resolution. Use `low|medium|high` for presets; `auto`\u002F`max` or explicit `WxH` may be used to control the negotiated stream size.\n  * `zoom=\u003Cvalue>`: Adjusts digital zoom (e.g., `1.0`, `2.5`).\n  * `scale=\u003Cvalue>`: Adjusts preview stream scale (per-camera; e.g., `0.5`, `1.0`).\n  * `exposure=\u003Cvalue>`: Adjusts exposure value (per-camera).\n  * `contrast=\u003Cvalue>`: Adjusts contrast (software; per-camera, integer).\n  * `torch=\u003Con|off|toggle>`: Controls the flashlight.\n  * `audio_gain=\u003Cvalue>`: Changes microphone gain multiplier (e.g., `1.0`, `2.0`).\n  * `focus_distance=\u003C0..1|-1>`: Set manual focus distance (0..1). Use `-1` to restore autofocus.\n  * `snapshot_res=\u003Cmax|stream>`: Choose snapshot resolution for the selected camera (`max` for full sensor, `stream` to match current stream resolution).\n  * `rotate=\u003Cdegrees>`: Rotate preview\u002Fsnapshot (persisted per-camera).\n  * `api=\u003Cauto|camerax|camera1>`: Prefer capture API implementation.\n* **Example command:** `https:\u002F\u002F[ip_address]:[port]\u002F?torch=on&zoom=2.0`\n\n## HTTPS\u002FTLS certificates\n\nTo protect the stream and the password from being sent in plain-text over HTTP, a certificate can be used to start the stream over HTTPS.\n\nThe app will automatically generate a self-signed certificate on first launch, but if you have your own domain you can use [Let's Encrypt](https:\u002F\u002Fletsencrypt.org) to generate a trusted certificate and skip the self-signed security warning message, by changing the TLS certificate in the settings.\n\nTo generate a new self-signed certificate, clear the app settings and restart or clone this repo and run `.\u002Fscripts\u002Fgenerate-certificate.sh` then use the certificate `personal_certificate.p12` file it generates.\n\n## Permissions\n\nThe app uses the following permissions to function:\n\n* **Camera (`android.permission.CAMERA`):** Required to capture and stream the video feed.\n* **Microphone (`android.permission.RECORD_AUDIO`):** Required to record and stream audio. (Requested optionally at runtime; streaming works without audio if denied).\n* **Notifications (`android.permission.POST_NOTIFICATIONS`):** Required on Android 13+ to post a persistent foreground service notification, keeping the background streaming server running reliably.\n* **Network (`android.permission.INTERNET`, `android.permission.ACCESS_NETWORK_STATE`):** Required to host the server and stream data to your browser\u002Fconnected clients.\n* **Storage (`android.permission.READ_EXTERNAL_STORAGE`):** Required on older Android versions to load custom TLS\u002FHTTPS certificates from file storage.\n* **Wi-Fi & Location (`android.permission.ACCESS_WIFI_STATE`, `android.permission.ACCESS_FINE_LOCATION`, `android.permission.NEARBY_WIFI_DEVICES`):** Used optionally to read the current Wi-Fi network's connection signal strength so it can be displayed in the web control panel overlay. If not granted, the Wi-Fi icon will be hidden.\n\n\u003Cdetails>\n\u003Csummary>Reproducible builds\u003C\u002Fsummary>\n\nThis project uses [reproducible builds](https:\u002F\u002Ff-droid.org\u002Fdocs\u002FReproducible_Builds\u002F). Release APKs should be built from a clean tree at the tagged commit using Gradle directly:\n\n```bash\n.\u002Fgradlew clean assembleRelease\n```\n\nThe release variant will automatically sign the APK build. Build-tools 35+ is known to produce signatures that fail reproducibility verification.\n\n### Build Variants\n\nBy default, release builds generate architecture-specific APK splits (armeabi-v7a, arm64-v8a) in addition to a universal APK. For F-Droid and other scenarios where a single universal APK is preferred, you can disable ABI splits:\n\n**F-Droid builds (single universal APK):**\n```bash\n.\u002Fgradlew clean assembleRelease -PenableAbiSplits=false\n```\n\n**Release builds with architecture-specific APKs (default):**\n```bash\n.\u002Fgradlew clean assembleRelease\n```\n\nThe `enableAbiSplits` property defaults to `true`. Set it to `false` to generate only the universal APK, which is the recommended approach for F-Droid to avoid unnecessary complexity in the build pipeline.\n\nTo verify that two unsigned builds from the same source are identical:\n\n```bash\nmkdir -p build\u002Funsigned\n.\u002Fgradlew clean assembleRelease -PskipSigning --no-daemon --max-workers=1 -Dorg.gradle.parallel=false\ncp app\u002Fbuild\u002Foutputs\u002Fapk\u002Frelease\u002F*universal-release.apk build\u002Funsigned\u002Fbuild1.apk\n.\u002Fgradlew clean assembleRelease -PskipSigning --no-daemon --max-workers=1 -Dorg.gradle.parallel=false\ncp app\u002Fbuild\u002Foutputs\u002Fapk\u002Frelease\u002F*universal-release.apk build\u002Funsigned\u002Fbuild2.apk\ncmp -s build\u002Funsigned\u002Fbuild1.apk build\u002Funsigned\u002Fbuild2.apk && echo OK\n# or: shasum -a 256 build\u002Funsigned\u002Fbuild1.apk build\u002Funsigned\u002Fbuild2.apk\n```\n\nIf they differ, inspect with `diffoscope build\u002Funsigned\u002Fbuild1.apk build\u002Funsigned\u002Fbuild2.apk`.\n\nTo verify your **signed** release APK matches an unsigned rebuild use `apksigcopier` - the first APK must be signed:\n\n```bash\n.\u002Fgradlew clean assembleRelease\napksigcopier compare app\u002Fbuild\u002Foutputs\u002Fapk\u002Frelease\u002F*universal-release.apk --unsigned build\u002Funsigned\u002Fbuild1.apk && echo OK\n```\n\nCI runs this check automatically via the [Reproducible Build workflow](.github\u002Fworkflows\u002Freproducible-build.yml).\n\nBuilds downloaded from the [official repository](https:\u002F\u002Fgithub.com\u002FDigitallyRefined\u002Fandroid-ip-camera\u002Freleases) should match the following signing certificate:\n\n```bash\napksigner verify --print-certs app\u002Fbuild\u002Foutputs\u002Fapk\u002Frelease\u002F*universal-release.apk\nSigner #1 certificate DN: CN=DigitallyRefined\nSigner #1 certificate SHA-256 digest: 1111be81c861e199c6485d367c37680c4b778fba301980d2f0f9a2800f77f70a\nSigner #1 certificate SHA-1 digest: 1560ceccdd719b2b97d431ad9a4c877abf5c2f32\nSigner #1 certificate MD5 digest: 5fdf04f5b6bab9fdacbe28aa6dc85abb\n```\n\n\u003C\u002Fdetails>\n","这是一款基于Android的IP摄像头应用，将手机摄像头实时转换为支持MJPEG和H.264编码的网络视频流服务器。核心功能包括内置HTTPS\u002FTLS流服务、Web远程控制面板（支持分辨率\u002F曝光\u002F缩放\u002F闪光灯等调节）、前后摄像头切换、后台静默流式传输及基础认证保护。适用于家庭安防监控、Home Assistant集成、临时远程视频采集等轻量级物联网视觉场景，无需额外硬件即可复用智能手机作为网络摄像机。",2,"2026-07-11 02:30:44","trending"]