“虞渠成” 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

2.3 KiB

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。请保持现状:

  • .soAssets/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.gradleimplementation 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 正常
    • 播放过程不应再出现长时间卡帧。