kotlin脚本ffmpeg批量转换mp3

使用kotlin脚本批量转换mp3文件

支持多线程,直接上代码

import java.io.File
import java.util.concurrent.*
import kotlin.concurrent.thread

inner class MyExecutor : Executor {
    private val poolSize = 5
    var isQuit = false
    private val blockQueue = ArrayBlockingQueue<Runnable>(poolSize)
    private val blockQueueReal = ArrayBlockingQueue<Runnable>(poolSize)
    private val threadPool: ExecutorService = Executors.newCachedThreadPool()
    fun isRunning() = blockQueueReal.isNotEmpty()
    fun quit() {
        isQuit = true
        println("quiting...")
    }

    fun getTaskCount(): Int {
        return blockQueueReal.size
    }

    fun getTotalCount(): Int {
        return index
    }

    private var index = 1
    override fun execute(command: Runnable) {
        blockQueue.put(command)
        blockQueueReal.put(command)
        index++
    }

    init {
        thread {
            while (!isQuit) {
                val runnable = blockQueue.take()
                threadPool.submit {
                    runnable.run()
                    blockQueueReal.poll()
                }
            }
        }
    }
}

val myExecutor = MyExecutor()
val audioMap = setOf("flac", "FLAC", "wav", "WAV", "ogg", "OGG")
var file = File(File("").absolutePath)

fun String.execute(): Process {
    return ProcessBuilder("cmd", "/c", this).redirectErrorStream(true).start()
}

fun execute(vararg cmds: String): Process {
    return ProcessBuilder("cmd", "/c", *cmds).redirectErrorStream(true).start()
}

fun File.getSuffix(): String {
    if (name.contains(".")) {
        val index = name.lastIndexOf('.') + 1
        return name.substring(index)
    }
    return ""
}

fun File.getPreFix(): String {
    if (name.contains(".")) {
        val index = name.lastIndexOf('.')
        return name.substring(0, index)
    }
    return ""
}
file.listFiles()?.forEach {
    findHIFIAudio(it)
}
println("parse mp3 finish.")

fun findHIFIAudio(file: File) {
    if (file.isFile) {
        if (audioMap.contains(file.getSuffix())) {
            println("找到无损音乐文件$file")
            val outPath = "${file.parentFile.path}${File.separatorChar}${
                file.getPreFix()
            }.mp3"
            if (File(outPath).exists()) {
                println("文件已经存在,跳过")
            } else {
                myExecutor.execute {
                    val process = execute(
                        "ffmpeg",
                        "-i",
                        file.path,
                        "-ab",
                        "320k",
                        "-map_metadata",
                        "0",
                        "-id3v2_version",
                        "3",
                        outPath
                    )
                    println(process.inputStream.reader().forEachLine {
//                        println(it)
                    })
                    process.waitFor()
                    println("${file.name}转换结束")
                    file.delete()
                }
            }
        }
    } else if (file.listFiles()?.isNotEmpty() == true) {
        file.listFiles()?.forEach {
            findHIFIAudio(it)
        }
    }
}
while (myExecutor.isRunning()) {
    println("正在等待所有任务结束,剩余${myExecutor.getTaskCount()}")
    Thread.sleep(1000)
}
myExecutor.quit()
println("结束,共转换了${myExecutor.getTotalCount()}个文件。")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值