Android开发记录:视频提取音频

文章目录

  • 前言
  • 使用方法

前言

Android开发中从视频中提取音频主要有三种方式结合FFmpeg,MP4Parser,MediaExtractor。
多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等,FFmpeg支持的音视频格式非常全面,github上也有很多不错相关开源框架。我在这里用的是RxFFmpeg。

使用方法

  1. 在根目录下的build.gradle里添加maven仓库
allprojects {
		repositories {
			...
			maven { url 'https://www.jitpack.io' }
		}
	}
  1. 添加依赖,最新版本
dependencies {
    implementation 'com.github.microshow:RxFFmpeg:2.1.0'
}
  1. 这里处理了截取视频中音频片段,有两个参数一个是startTime 截取的开始时间,另外一个是time 就是你要截取的总时长。这里还需一个要注意的地方就是给文件命名不可以出现重复,我就直接取当前时间戳了,再在后边拼接上你需要的音频格式(.wav/.mp3等)。
override fun extractAudio(startTime: String, time: String, path: String,name:String,deType:String) {

        var type = SharedPreferencesUtils.getString(
            MyApplication.INSTANCE,
            Constants.AudioType.TYPE_KEY,
            Constants.AudioType.MP3
        )
        if(deType!="") type = deType
        audioName = name
        fileName = TimeUtil.getCurrentTimeStamp()+"audio"+type //当前时间戳加音频格式
        if (startTime == "") {
            commands = "ffmpeg -i ".plus(path).plus(" -vn ")
                .plus(Constants.LOCAL_PATH)
                .plus(fileName
                )
        } else {
            commands =
                "ffmpeg -i ".plus(path).plus(" -vn ").plus("-ss ").plus(startTime).plus(" -t ")
                    .plus(time + " ").plus(Constants.LOCAL_PATH).plus(fileName)
        }

        Logger.d(commands)

        var commandsArray = commands.split(" ")
        Logger.d(commandsArray)

        runFFmpegRxJava(commandsArray)

    }
    
private fun runFFmpegRxJava(commandsArray: List<String>) {

        RxFFmpegInvoke.getInstance().runCommandRxJava(commandsArray.toTypedArray())
            .subscribe(object : RxFFmpegSubscriber() {
                override fun onFinish() {
                    Logger.d("onFinish")
                    view?.extractSuc(fileName,audioName)
                }

                override fun onCancel() {
                    view?.extractFail("您已经取消转换!")
                    Logger.d("onCancel")
                }

                override fun onProgress(progress: Int, progressTime: Long) {
                    //Logger.d("onCancel")
                }

                override fun onError(message: String?) {
                    view?.extractFail(message.toString())
                    Logger.d("onError:" + message)
                }
            })
    }

你可能感兴趣的:(开发记录)