在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:FFmpegCommand开源软件地址:https://gitee.com/anjoiner/FFmpegCommand开源软件介绍:
前景提要在我们的开发中,经常会用到音视频相关内容,一般我们都会选择FFmpeg,但是其交叉编译对于我们来说是一件很麻烦的事情.所以这里方便日后使用就编写了这个 注意:当前库只适用于Android 如果访问不了全部信息,请跳转【国内镜像】 主要功能
引入在项目根目录下找到 allprojects { repositories { ... maven { url 'https://jitpack.io' } }} 然后在 下面两种引入只选择一种即可,并根据最新版本替换下面的 // 全部编解码-体积较大implementation 'com.github.AnJoiner:FFmpegCommand:1.2.1'// 部分常用编解码-体积较小,比上面引入减少大约6Mimplementation 'com.github.AnJoiner:FFmpegCommand:1.2.1-lite' 更改module下build.gradle,当前库只支持 android { defaultConfig { ndk { abiFilters "armeabi-v7a",'arm64-v8a' moduleName "app" } }} 如果没有特别的编解码需求,强烈推荐建议使用 使用下面只展示部分使用,其他可以参考 【WIKI】 FFmpegCommand方法
runCmd以 不支持异步执行FFmpeg命令,毕竟C是面向过程语言,会出现资源占用问题 GlobalScope.launch { FFmpegCommand.runCmd(FFmpegUtils.transformAudio(audioPath, targetPath), callback("音频转码完成", targetPath))} 第二个参数是回调方法 open class CommonCallBack : IFFmpegCallBack { // 开始回调 override fun onStart() {} // 进度回调 override fun onProgress(progress: Int, pts: Long) {} // 取消回调 override fun onCancel() {} // 完成回调 override fun onComplete() {} // 错误回调 override fun onError(errorCode: Int, errorMsg: String?) {}} 需要注意的是在
var duration :Int? = FFmpegCommand.getMediaInfo(mAudioPath,MediaAttribute.DURATION)var progress = pts/duration!! 自定义FFmpeg命令这里只是演示了音频剪切,很多如上述功能请自行查阅FFmpegUtils如果其中不满足需求,可添加自己的FFmpeg命令.例如: var command = "ffmpeg -y -i %s -vn -acodec copy -ss %d -t %d %s"command = String.format(command, srcFile, startTime, duration, targetFile)GlobalScope.launch { FFmpegCommand.runCmd(command.split(" ").toTypedArray(), callback("音频剪切完成", targetPath))} 多进程执行由于底层暂时无法实现多线程(毕竟C是面向过程的语言),所以如果需要在推流的同时,是无法再同时执行其他命令。为了解决这个问题,可以使用如下多进程方法:
<service android:name=".service.FFmpegCommandService" android:process=":ffmpegCommand" /><service android:name=".service.FFmpegCommandService2" android:process=":ffmpegCommand2" />
class FFmpegCommandService : Service() { override fun onBind(intent: Intent): IBinder? { return null } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { val videoPath = File(externalCacheDir, "test.mp4").absolutePath val output = File(externalCacheDir, "output.yuv").absolutePath val cmd = "ffmpeg -y -i %s -an -c:v rawvideo -pixel_format yuv420p %s" val result = String.format(Locale.CHINA, cmd, videoPath, output) val strings: Array<String?> = result.split(" ").toTypedArray() FFmpegCommand.runCmd(strings) return super.onStartCommand(intent, flags, startId) }} 取消执行执行下面方法后将会回调 FFmpegCommand.cancel(); 参考【KFFmpegCommandActivity-命令使用参考】【KFFmpegInfoActivity-媒体信息参考】【KFFmppegFormatActivity-支持封装格式】【KFFmpegCodecActivity-支持编解码】 兼容性兼容Android minSdkVersion >=21 编译SO【编译FFmpeg在Android中使用】【自定义MP3编码器】 体验交流
Star如果觉得对你有所帮助,给个Star支持一下吧,也欢迎多多fork! 混淆-keep class com.coder.ffmpeg.** {*;}-dontwarn com.coder.ffmpeg.** LicenseCopyright 2019 AnJoinerLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. |
请发表评论