- 集成 ffmpeg-kit-full-gpl 6.0.3(arm64),用 libx264 重编码修复 .h264 缺 SPS/PPS 导致的播放卡死 - 新增 VideoDownloadPlayService/VideoCacheManager,.mp4 直下直播、.h264 下载后转 mp4 缓存,转码完成后删除临时 .h264 - FFmpegKitBridge 走主线程 JNI 调用规避 IL2CPP 后台线程 FindClass 不稳定 - 视频列表按缓存状态显示 下载/播放 按钮,下载中亮色条显示百分比;播放面板原下载按钮改为保存到相册
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
升级方法
- 重新下载目标版本 aar。
- 解压,用
jni/arm64-v8a/*.so整体覆盖上面 jniLibs 目录(含 libc++_shared.so)。 - 用 aar 内
classes.jar覆盖 libs/ 下的 jar。 - clean 重建 release(不要增量)。
备注
- x264 为 GPL,与服务端已用的 libx264 转码策略一致,License 口径以项目自身为准。
- 播放验证关键日志:
[VideoDownloadPlayService]->[FFmpegKitBridge] args(确认含libx264)rc=isSuccess=True、[ProbeMp4Info]mp4 正常尺寸[vf-3]VideoPrepared 的 frameCount / length 正常- 播放过程不应再出现长时间卡帧。