|
|
基本录音代码实现:
- import com.arthenica.ffmpegkit.FFmpegKit
- import com.arthenica.ffmpegkit.ReturnCode
- class AudioRecorder {
- private var isRecording = false
-
- fun startRecording(outputPath: String) {
- if (isRecording) return
-
- // FFmpeg 命令录制音频
- val command = "-f android_camera -i 0 -acodec aac $outputPath"
-
- FFmpegKit.executeAsync(command) { session ->
- val returnCode = session.returnCode
-
- if (ReturnCode.isSuccess(returnCode)) {
- // 录制成功
- isRecording = false
- } else if (ReturnCode.isCancel(returnCode)) {
- // 录制被取消
- isRecording = false
- } else {
- // 录制失败
- isRecording = false
- }
- }
-
- isRecording = true
- }
-
- fun stopRecording() {
- if (isRecording) {
- FFmpegKit.cancel()
- }
- }
- }
复制代码 更完整的录音实现:
- import android.Manifest
- import android.content.pm.PackageManager
- import android.os.Build
- import androidx.appcompat.app.AppCompatActivity
- import androidx.core.app.ActivityCompat
- import com.arthenica.ffmpegkit.FFmpegKit
- import com.arthenica.ffmpegkit.FFmpegSession
- import com.arthenica.ffmpegkit.ReturnCode
- import java.io.File
- class MainActivity : AppCompatActivity() {
- private var recordingSession: FFmpegSession? = null
- private val PERMISSION_REQUEST_CODE = 1001
-
- private fun checkAndRequestPermissions() {
- val permissions = mutableListOf(Manifest.permission.RECORD_AUDIO)
-
- if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
- permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
- }
-
- if (permissions.any {
- ActivityCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
- }) {
- ActivityCompat.requestPermissions(this, permissions.toTypedArray(), PERMISSION_REQUEST_CODE)
- } else {
- startAudioRecording()
- }
- }
-
- private fun startAudioRecording() {
- val outputFile = File(getExternalFilesDir(null), "recording.aac").absolutePath
-
- // 使用 FFmpeg 录制音频命令
- val command = buildString {
- append("-f avfoundation ") // iOS/macOS
- append("-i :0 ") // 默认音频输入设备
- append("-acodec aac ") // 音频编码器
- append("-ar 44100 ") // 采样率
- append("-ac 2 ") // 双声道
- append("-b:a 128k ") // 音频比特率
- append(outputFile)
- }
-
- // Android 平台可能需要不同的命令格式
- val androidCommand = "-f android_camera -i 0 -acodec aac -ar 44100 -ac 1 $outputFile"
-
- recordingSession = FFmpegKit.executeAsync(androidCommand) { session ->
- if (ReturnCode.isSuccess(session.returnCode)) {
- // 录制完成
- runOnUiThread {
- // 处理录制完成的逻辑
- }
- } else {
- // 录制出错
- runOnUiThread {
- // 处理错误
- }
- }
- }
- }
-
- private fun stopAudioRecording() {
- recordingSession?.let {
- FFmpegKit.cancel(it.sessionId)
- }
- }
-
- override fun onRequestPermissionsResult(
- requestCode: Int,
- permissions: Array<out String>,
- grantResults: IntArray
- ) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults)
-
- if (requestCode == PERMISSION_REQUEST_CODE) {
- if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
- startAudioRecording()
- }
- }
- }
- }
复制代码 自定义录音参数:
- class AudioRecorderConfig {
- // 不同质量的录音配置
- fun getRecordingCommand(
- outputPath: String,
- quality: RecordingQuality = RecordingQuality.MEDIUM
- ): String {
- return when (quality) {
- RecordingQuality.HIGH -> {
- "-f android_camera -i 0 -acodec aac -ar 48000 -ac 2 -b:a 192k $outputPath"
- }
- RecordingQuality.MEDIUM -> {
- "-f android_camera -i 0 -acodec aac -ar 44100 -ac 2 -b:a 128k $outputPath"
- }
- RecordingQuality.LOW -> {
- "-f android_camera -i 0 -acodec aac -ar 22050 -ac 1 -b:a 64k $outputPath"
- }
- }
- }
-
- enum class RecordingQuality {
- HIGH, MEDIUM, LOW
- }
- }
复制代码
注意事项
1、平台差异: Android 和 iOS 平台的 FFmpeg 命令参数可能不同
2、权限处理: 确保获取了必要的录音权限
3、设备兼容性: 不同设备的音频输入格式可能不同
4、性能考虑: 长时间录音可能影响设备性能
5、存储管理: 注意录音文件的存储位置和大小管理
通过以上代码,您可以使用 ffmpeg-kit 实现麦克风录音功能,并根据需要调整录音质量和格式。
|
|