You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.9 KiB
64 lines
1.9 KiB
package com.frank.androidmedia.util
|
|
|
|
import android.util.Log
|
|
import java.io.*
|
|
|
|
/**
|
|
* Convert pcm to wav
|
|
*
|
|
* @author frank
|
|
* @date 2022/3/22
|
|
*/
|
|
object WavUtil {
|
|
|
|
fun makePCMToWAVFile(pcmPath: String?, wavPath: String?, deletePcmFile: Boolean): Boolean {
|
|
val buffer: ByteArray
|
|
val file = File(pcmPath)
|
|
if (!file.exists()) {
|
|
return false
|
|
}
|
|
val len = file.length().toInt()
|
|
val header = WavHeader()
|
|
header.riffSize = len + (44 - 8)
|
|
header.formatSize = 16
|
|
header.bitsPerSample = 16
|
|
header.numChannels = 2
|
|
header.formatTag = 0x0001
|
|
header.sampleRate = 44100
|
|
header.blockAlign = (header.numChannels * header.bitsPerSample / 8).toShort()
|
|
header.avgBytesPerSec = header.blockAlign * header.sampleRate
|
|
header.dataSize = len
|
|
val h: ByteArray = try {
|
|
header.header
|
|
} catch (e1: IOException) {
|
|
Log.e("WavUtil", e1.message)
|
|
return false
|
|
}
|
|
if (h.size != 44) return false
|
|
val dstFile = File(wavPath)
|
|
if (dstFile.exists()) dstFile.delete()
|
|
try {
|
|
buffer = ByteArray(1024 * 4)
|
|
val inStream: InputStream
|
|
val ouStream: OutputStream
|
|
ouStream = BufferedOutputStream(FileOutputStream(wavPath))
|
|
ouStream.write(h, 0, h.size)
|
|
inStream = BufferedInputStream(FileInputStream(file))
|
|
var size = inStream.read(buffer)
|
|
while (size != -1) {
|
|
ouStream.write(buffer)
|
|
size = inStream.read(buffer)
|
|
}
|
|
inStream.close()
|
|
ouStream.close()
|
|
} catch (e: IOException) {
|
|
Log.e("WavUtil", e.message)
|
|
return false
|
|
}
|
|
if (deletePcmFile) {
|
|
file.delete()
|
|
}
|
|
Log.i("WavUtil", "makePCMToWAVFile success...")
|
|
return true
|
|
}
|
|
} |