“虞渠成” 4726107e19 feat(video,android): 视频下载转码播放 + 列表下载/播放按钮
- 集成 ffmpeg-kit-full-gpl 6.0.3(arm64),用 libx264 重编码修复 .h264 缺 SPS/PPS 导致的播放卡死

- 新增 VideoDownloadPlayService/VideoCacheManager,.mp4 直下直播、.h264 下载后转 mp4 缓存,转码完成后删除临时 .h264

- FFmpegKitBridge 走主线程 JNI 调用规避 IL2CPP 后台线程 FindClass 不稳定

- 视频列表按缓存状态显示 下载/播放 按钮,下载中亮色条显示百分比;播放面板原下载按钮改为保存到相册
2026-09-08 13:31:31 +08:00

53 lines
2.3 KiB
Markdown

# FFmpegKit (full-gpl) 归档与放置说明
本项目用 ffmpeg-kit 在 Android 端做 H.264/裸流 → MP4 转码(libx264 重编码),
以修复各设备(如 OPPO/MTK)解码器对坏 PPS 流播放卡死的问题。
## 依赖来源
- Maven: `dev.ffmpegkit-maintained:ffmpeg-kit-full-gpl:6.0.3`
(原 `com.arthenica:ffmpeg-kit-full` 已于 2025-04 从 Maven Central 下架;`full` 不含 x264,必须用 `full-gpl`)
- FFmpeg 内部版本: **n6.1.6**
- 含 libx264(重编码用)
- 仅 arm64-v8a(项目只发布 arm64)
本目录 `ffmpeg-kit-full-gpl-6.0.3.aar` 即下载的原始包(36.6MB),作为来源/备份。
## 运行时文件位置(勿乱动!)
Unity Android 对 native 库与 jar 的打包位置有强约束,放错地方会导致 APK 缺少
native 库或类,运行时 `UnsatisfiedLinkError`/`ClassNotFoundException`。请**保持现状**:
- `.so``Assets/Plugins/Android/jniLibs/arm64-v8a/`
- libavcodec / libavdevice / libavfilter / libavformat / libavutil
- libswresample / libswscale
- libffmpegkit / libffmpegkit_abidetect
- **libc++_shared.so(必带,full 构建的 C++ 运行时依赖)**
- 类包 → `Assets/Plugins/Android/libs/ffmpeg-kit-classes.jar`
(由 `Assets/Plugins/Android/mainTemplate.gradle`
`implementation files('libs/ffmpeg-kit-classes.jar')` 引用)
## 调用链
- C# 桥接: `Assets/Scripts/Video/FFmpegKitBridge.cs`
- `#if UNITY_ANDROID && !UNITY_EDITOR`(Android 专用)
- JNI 必须在 Unity 主线程执行:经由 `MainThreadDispatcher.cs` 派发
- 转码参数: `-c:v libx264 -preset ultrafast -crf 23 -pix_fmt yuv420p -movflags +faststart -fflags +genpts`
- 视频页: `Assets/Scripts/UI/Pages/VideoPage/VideoPageCtrl.cs`
- 下载/播放服务: `Assets/Scripts/Video/VideoDownloadPlayService.cs`
## 升级方法
1. 重新下载目标版本 aar。
2. 解压,用 `jni/arm64-v8a/*.so` 整体覆盖上面 jniLibs 目录(含 libc++_shared.so)。
3. 用 aar 内 `classes.jar` 覆盖 libs/ 下的 jar。
4. clean 重建 release(不要增量)。
## 备注
- x264 为 GPL,与服务端已用的 libx264 转码策略一致,License 口径以项目自身为准。
- 播放验证关键日志:
- `[VideoDownloadPlayService]` -> `[FFmpegKitBridge] args`(确认含 `libx264`)
- `rc=` `isSuccess=True``[ProbeMp4Info]` mp4 正常尺寸
- `[vf-3]` VideoPrepared 的 frameCount / length 正常
- 播放过程不应再出现长时间卡帧。