淘宝客建站模板,wordpress 图片水印,西宁建设工程官方网站,环境网站模板在安卓中用到的三方库#xff1a;https://github.com/arthenica/ffmpeg-kit
这个库很强大#xff0c;支持很多平台#xff0c;每个平台都有各自的分支代码#xff0c;用了一段时间#xff0c;稳定性挺好的#xff0c;
找到安卓下的分支#xff1a;FFmpegKit for Andro…在安卓中用到的三方库https://github.com/arthenica/ffmpeg-kit
这个库很强大支持很多平台每个平台都有各自的分支代码用了一段时间稳定性挺好的
找到安卓下的分支FFmpegKit for Android FFmpegKit Android 版
引入项目
repositories {mavenCentral()
}dependencies {implementation com.arthenica:ffmpeg-kit-full:6.0-2
}每个平台下又分为多个库每个库包含不同的功能因为功能越丰富导入到项目中编译的包体积越大尽量选择适合自己功能的库进行使用。 FFmpeg 编译配置选项库依赖分类
配置项说明包含的库min最小化构建-min-gpl最小化构建并启用 GPL 库vid.stab, x264, x265, xvidcorehttps启用 HTTPS 支持使用非-GPL 依赖gmp, gnutlshttps-gpl启用 HTTPS 支持使用 GPL 兼容依赖gmp, gnutls, vid.stab, x264, x265, xvidcoreaudio启用音频相关编码器/解码器lame, libilbc, libvorbis, opencore-amr, opus, shine, soxr, speex, twolame, vo-amrwbencvideo启用视频相关编码器/解码器dav1d, fontconfig, freetype, fribidi, kvazaar, libass, libiconv, libtheora, libvpx, libwebp, snappy, zimgfull启用所有非 GPL 第三方库dav1d, fontconfig, freetype, fribidi, gmp, gnutls, kvazaar, libass, libiconv, libilbc, libtheora, libvorbis, libvpx, libwebp, libxml2, opencore-amr, opus, shine, snappy, soxr, speex, twolame, vo-amrwbenc, zimgfull-gpl启用所有库包括 GPLdav1d, fontconfig, freetype, fribidi, gmp, gnutls, kvazaar, lame, libass, libiconv, libilbc, libtheora, libvorbis, libvpx, libwebp, libxml2, opencore-amr, opus, shine, snappy, soxr, speex, twolame, vid.stab, vo-amrwbenc, x264, x265, xvidcore, zimg比如你如果只需要保存 rtsp 视频流 和 推流的话只需要导入 min-gpl即可 implementation com.arthenica:ffmpeg-kit-min-gpl:6.0-2如果你想要更多比如添加水印就涉及到 FFmpeg 滤镜相关功能就需要引入full-gpl implementation com.arthenica:ffmpeg-kit-full-gpl:6.0-2具体需要什么功能可以进去看说明说明没有涉及到的并且你不想用全功能库你也可以一个一个试试也许就能满足你。
正文开始 由说明可知使用方式为
import com.arthenica.ffmpegkit.FFmpegKit;FFmpegSession session FFmpegKit.execute(-i file1.mp4 -c:v mpeg4 file2.mp4);
if (ReturnCode.isSuccess(session.getReturnCode())) {// SUCCESS} else if (ReturnCode.isCancel(session.getReturnCode())) {// CANCEL} else {// FAILURELog.d(TAG, String.format(Command failed with state %s and rc %s.%s, session.getState(), session.getReturnCode(), session.getFailStackTrace()));}或者异步调用
FFmpegKit.executeAsync(-i file1.mp4 -c:v mpeg4 file2.mp4, new FFmpegSessionCompleteCallback() {Overridepublic void apply(FFmpegSession session) {SessionState state session.getState();ReturnCode returnCode session.getReturnCode();// CALLED WHEN SESSION IS EXECUTEDLog.d(TAG, String.format(FFmpeg process exited with state %s and rc %s.%s, state, returnCode, session.getFailStackTrace()));}
}, new LogCallback() {Overridepublic void apply(com.arthenica.ffmpegkit.Log log) {// CALLED WHEN SESSION PRINTS LOGS}
}, new StatisticsCallback() {Overridepublic void apply(Statistics statistics) {// CALLED WHEN SESSION GENERATES STATISTICS}
});与正常 ffmpeg 命令不同的是在传入命令时前面不需要加 “ffmpeg” 关键字只需传入后面的具体命令即可加上会报错哦
关键代码
搞了好久才凑齐的正确代码这东西真不能听 AI 的一面之辞不然就被 AI 一条路领到黑 private static String buildWatermarkCommand(VideoFile file, VideoTimeRange timeRange, String outputPath, String fontPath) {FFmpegKitConfig.setFontconfigConfigurationPath(fontPath);String drawtextFilter String.format(drawtexttext%s:fontfile%s:fontcolorwhite:fontsize20:x0:y30,DEFAULT_WATERMARK, fontPath);ListString commandList new ArrayList();commandList.add(-ss); // 指定输入文件的开始时间格式HH:MM:SScommandList.add(timeRange.startTime);commandList.add(-i); // 输入文件路径commandList.add(file.filePath);commandList.add(-t); // 指定持续时间格式HH:MM:SScommandList.add(timeRange.durationStr);commandList.add(-vf); // 视频滤镜用于添加水印文字commandList.add(drawtextFilter);commandList.add(-c:v); // 视频编码器设置commandList.add(VIDEO_CODEC); // 使用H.264软件编码器commandList.add(-preset); // 编码速度预设commandList.add(VIDEO_PRESET); // ultrafast最快编码速度文件稍大commandList.add(-crf); // 恒定质量因子0-51越小质量越好commandList.add(String.valueOf(VIDEO_CRF)); // 23平衡质量和文件大小的推荐值commandList.add(-c:a); // 音频编码器设置commandList.add(copy); // 直接复制音频流不重新编码commandList.add(-r);commandList.add(20); // 每秒20帧commandList.add(-avoid_negative_ts); // 避免负时间戳问题commandList.add(make_zero); // 将负时间戳调整为0commandList.add(outputPath); // 输出文件路径return String.join( , commandList);}简单介绍下命令作用对一段现有的视频文件进行剪辑-ss指定开始时间比如要剪切的原视频时长为两分钟所以开始时间到结束时间就是00:00:00 - 00:02:00 , 假设要剪辑中间一分钟的视频那么 -ss指定的开始时间为00:00:30 , -t持续时间就是00:01:00 , 截取的时间段为00:00:30 - 00:01:30 -c:v设置编码器一般 H.264 就够了如果设置其他的编码器要看你的设备支持不支持了-r设置帧率如果你想要剪切的视频大小小一点一方面就可以通过降低帧率另一方面就可以降低码率来实现(上述命令码率未指定默认按原视频码率)。
如果你指定的时间范围超过原视频时长会报错这很正常只是报错内容可能看不懂这是一个问题点
设置 FFmpegKitConfig.setFontconfigConfigurationPath的作用是 https://github.com/arthenica/ffmpeg-kit/wiki/Tips 参考第四条ffmpeg 需要有效的 fontconfig 配置才能在使用 drawtext filter 时渲染文本。
这里指定一个存在的字体路径即可 比如/system/fonts/NotoSansCJK-Regular.ttc
注意有的字体不支持中文写入中文水印的时候会乱码 视频处理性能测试A133Android 10
测试环境
设备平台A133操作系统Android 10测试内容视频加水印 vs 无水印处理加水印帧率15fps视频格式H.264 (宽高720x576)位率512Kbps
性能对比数据
视频时长处理方式耗时ms耗时秒输出文件大小30s加水印52145.211.5M30s加水印15帧38133.811.5M30s不加水印1680.170.9M60s加水印1201312.012.5M60s加水印15帧73927.392.5M60s不加水印2080.211.5M120s加水印2200622.015.03M120s加水印15帧1840418.405.03M120s不加水印2770.282.8M240s加水印5054750.5510.57M240s加水印15帧3785737.8610.57M240s不加水印4480.455.24M
在 A133 平台上加水印操作是性能瓶颈视频重编码操作对cpu要求比较高。 补充
在低端设备使用FFmpeg处理视频显然是不推荐的更是不明智的除非无可选择可以选择的替代方式为在手机或者在服务器进行视频处理操作这样速度和体验感更好。
在手机处理发现 不设置 FFmpegKitConfig.setFontconfigConfigurationPath也可以正常添加水印这个操作应该是可有可无的或者在特殊地方才会使用到它有待发现。
开发中发现只有full-gpl库才能进行加水印重编码操作其他库均不行没办法只有一个加水印操作也要引入全功能apk包体积大概增加13M左右而且这只是在应用只支持arm64-v8a的情况下多一个就翻一倍
而且full-gpl:6.0-2最低要求sdk 24,如果你的应用之前最小sdk 小于23,然后改为24时你会发现包体积大小剧增这是因为minSdkVersion 23 默认不压缩so 大小 导致apk体积会变大大于23 就在清单文件的application标签下设置 android:extractNativeLibstrue 压缩so 就正常了。