| app/src/main/java/com/anyun/h264/H264EncodeService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| 多进程方案使用说明.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
app/src/main/java/com/anyun/h264/H264EncodeService.java
@@ -36,6 +36,7 @@ private H264FileTransmitter h264FileTransmitter; // H264æä»¶ä¼ è¾å¨ private String outputFileDirectory; // H264æä»¶è¾åºç®å½ private WatermarkInfo currentWatermarkInfo; // å½åæ°´å°ä¿¡æ¯ private static final int H264_FILE_RETENTION_DAYS = 5; // 坿 ¹æ®éæ±è°æ´ä¸º3æ5天 // å¤è¿ç¨æ¯æï¼ç¬¬äºä¸ªæå头çæå¡è¿æ¥ private IH264EncodeService camera2Service; @@ -78,6 +79,9 @@ // åå§åè¾åºæä»¶ç®å½ï¼ä½¿ç¨åºç¨å¤é¨åå¨ç®å½ï¼ outputFileDirectory = getExternalFilesDir(null).getAbsolutePath(); Timber.d("Output file directory: %s", outputFileDirectory); // æ¸ çè¿æçH264æä»¶ cleanupExpiredH264Files(H264_FILE_RETENTION_DAYS); } @Override @@ -795,6 +799,41 @@ } /** * å é¤è¶ è¿ä¿çæçH264æä»¶ */ private void cleanupExpiredH264Files(int retentionDays) { if (outputFileDirectory == null) { Timber.w("cleanupExpiredH264Files: outputFileDirectory is null"); return; } File dir = new File(outputFileDirectory); if (!dir.exists() || !dir.isDirectory()) { Timber.w("cleanupExpiredH264Files: directory invalid -> %s", outputFileDirectory); return; } long retentionMillis = TimeUnit.DAYS.toMillis(Math.max(1, retentionDays)); long cutoffTime = System.currentTimeMillis() - retentionMillis; File[] files = dir.listFiles((d, name) -> name.toLowerCase(Locale.CHINA).endsWith(".h264")); if (files == null || files.length == 0) { return; } for (File file : files) { if (file.lastModified() < cutoffTime) { boolean deleted = file.delete(); if (deleted) { Timber.i("Deleted expired H264 file: %s", file.getAbsolutePath()); } else { Timber.w("Failed to delete expired H264 file: %s", file.getAbsolutePath()); } } } } /** * 仿件åå»ºèµæºä¿¡æ¯ï¼å¦ææä»¶å¨æ¶é´èå´å ï¼ */ private ResourceInfo createResourceInfoFromFile(File file, Date startDate, Date endDate) { ¶à½ø³Ì·½°¸Ê¹ÓÃ˵Ã÷.md
New file @@ -0,0 +1,117 @@ # å¤è¿ç¨æ¹æ¡ä½¿ç¨è¯´æ ## æ¦è¿° æ¬æ¹æ¡éè¿å¤è¿ç¨å®ç°ä¸¤ä¸ªUSBæå头忶工ä½ãæ¯ä¸ªæå头è¿è¡å¨ç¬ç«çè¿ç¨ä¸ï¼æ¯ä¸ªè¿ç¨æ¥æç¬ç«çH264Encoderå®ä¾ï¼ä»èé¿å äºåºå±Cåºçåå®ä¾éå¶ã ## æ¶æè¯´æ - **H264EncodeService**ï¼ä¸»è¿ç¨æå¡ï¼å¤ç第ä¸ä¸ªæå头ï¼cameraId=1ï¼ - **H264EncodeService2**ï¼ç¬ç«è¿ç¨æå¡ï¼`:camera2`ï¼ï¼å¤ç第äºä¸ªæå头ï¼cameraId=2ï¼ ## ä½¿ç¨æ¹æ³ ### å¯å¨ç¬¬ä¸ä¸ªæå头ï¼cameraId=1ï¼ ```json { "width": 640, "height": 480, "framerate": 25, "cameraId": 1 } ``` æè 䏿å®cameraIdï¼é»è®¤ä¸º1ï¼ï¼ ```json { "width": 640, "height": 480, "framerate": 25 } ``` ### å¯å¨ç¬¬äºä¸ªæå头ï¼cameraId=2ï¼ ```json { "width": 640, "height": 480, "framerate": 25, "cameraId": 2 } ``` ### ç½ç»æ¨éç¤ºä¾ **第ä¸ä¸ªæå头ï¼** ```json { "ip": "192.168.1.100", "port": 8888, "width": 640, "height": 480, "framerate": 25, "simPhone": "013120122580", "cameraId": 1 } ``` **第äºä¸ªæå头ï¼** ```json { "ip": "192.168.1.100", "port": 8889, "width": 640, "height": 480, "framerate": 25, "simPhone": "013120122580", "cameraId": 2 } ``` ### 忢æå®æå头 åæ¢ç¬¬ä¸ä¸ªæåå¤´ï¼ ```json { "cameraId": 1 } ``` åæ¢ç¬¬äºä¸ªæåå¤´ï¼ ```json { "cameraId": 2 } ``` 妿䏿å®cameraIdï¼é»è®¤åæ¢ç¬¬ä¸ä¸ªæå头ã ## å ³é®ç¹æ§ 1. **è¿ç¨é离**ï¼ä¸¤ä¸ªæå头è¿è¡å¨å®å ¨ç¬ç«çè¿ç¨ä¸ï¼äºä¸å¹²æ° 2. **èªå¨è·¯ç±**ï¼ä¸»æå¡æ ¹æ®cameraIdèªå¨è·¯ç±å°å¯¹åºçè¿ç¨ 3. **ç¬ç«é ç½®**ï¼æ¯ä¸ªæå头å¯ä»¥ç¬ç«é ç½®å辨çã帧çãç½ç»åæ°ç 4. **ç¬ç«æä»¶**ï¼ç¬¬äºä¸ªæå头çæä»¶ä¼æ·»å `camera2`æ è¯ï¼ä¾¿äºåºå 5. **ç¬ç«éé**ï¼ç¬¬äºä¸ªæå头使ç¨`logicalChannelId=2`ï¼ç¬¬ä¸ä¸ªä½¿ç¨`logicalChannelId=1` ## æä»¶å½å - 第ä¸ä¸ªæå头ï¼`h264_1234567890123.h264` - 第äºä¸ªæå头ï¼`h264_camera2_1234567890123.h264` ## 注æäºé¡¹ 1. ç¡®ä¿ä¸¤ä¸ªUSBæå头é½å·²æ£ç¡®è¿æ¥ 2. 第äºä¸ªæå头åºå®ä½¿ç¨cameraId=2ï¼ç¬¬ä¸ä¸ªæå头使ç¨cameraId=1ï¼æä¸æå®ï¼ 3. 两个è¿ç¨å¯ä»¥åæ¶è¿è¡ï¼äºä¸å½±å 4. æ¯ä¸ªè¿ç¨é½æç¬ç«çH264Encoderå®ä¾ï¼å æ¤å¯ä»¥çæ£å¹¶åå·¥ä½ ## ææ¯å®ç° - 主æå¡éè¿AIDLç»å®å°ç¬¬äºä¸ªè¿ç¨çæå¡ - 第äºä¸ªè¿ç¨éè¿`android:process=":camera2"`é ç½®å¨ç¬ç«è¿ç¨ä¸è¿è¡ - æææä½é½éè¿AIDLæ¥å£è¿è¡è¿ç¨é´éä¿¡