Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 78|回复: 0

使用 ffmpeg-kit通过麦克风录

[复制链接]

394

主题

559

帖子

3303

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3303
发表于 2025-10-12 07:14:03 | 显示全部楼层 |阅读模式
基本录音代码实现:
  1. import com.arthenica.ffmpegkit.FFmpegKit
  2. import com.arthenica.ffmpegkit.ReturnCode

  3. class AudioRecorder {
  4.     private var isRecording = false
  5.    
  6.     fun startRecording(outputPath: String) {
  7.         if (isRecording) return
  8.         
  9.         // FFmpeg 命令录制音频
  10.         val command = "-f android_camera -i 0 -acodec aac $outputPath"
  11.         
  12.         FFmpegKit.executeAsync(command) { session ->
  13.             val returnCode = session.returnCode
  14.             
  15.             if (ReturnCode.isSuccess(returnCode)) {
  16.                 // 录制成功
  17.                 isRecording = false
  18.             } else if (ReturnCode.isCancel(returnCode)) {
  19.                 // 录制被取消
  20.                 isRecording = false
  21.             } else {
  22.                 // 录制失败
  23.                 isRecording = false
  24.             }
  25.         }
  26.         
  27.         isRecording = true
  28.     }
  29.    
  30.     fun stopRecording() {
  31.         if (isRecording) {
  32.             FFmpegKit.cancel()
  33.         }
  34.     }
  35. }
复制代码
更完整的录音实现:
  1. import android.Manifest
  2. import android.content.pm.PackageManager
  3. import android.os.Build
  4. import androidx.appcompat.app.AppCompatActivity
  5. import androidx.core.app.ActivityCompat
  6. import com.arthenica.ffmpegkit.FFmpegKit
  7. import com.arthenica.ffmpegkit.FFmpegSession
  8. import com.arthenica.ffmpegkit.ReturnCode
  9. import java.io.File

  10. class MainActivity : AppCompatActivity() {
  11.     private var recordingSession: FFmpegSession? = null
  12.     private val PERMISSION_REQUEST_CODE = 1001
  13.    
  14.     private fun checkAndRequestPermissions() {
  15.         val permissions = mutableListOf(Manifest.permission.RECORD_AUDIO)
  16.         
  17.         if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
  18.             permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
  19.         }
  20.         
  21.         if (permissions.any {
  22.             ActivityCompat.checkSelfPermission(this, it) != PackageManager.PERMISSION_GRANTED
  23.         }) {
  24.             ActivityCompat.requestPermissions(this, permissions.toTypedArray(), PERMISSION_REQUEST_CODE)
  25.         } else {
  26.             startAudioRecording()
  27.         }
  28.     }
  29.    
  30.     private fun startAudioRecording() {
  31.         val outputFile = File(getExternalFilesDir(null), "recording.aac").absolutePath
  32.         
  33.         // 使用 FFmpeg 录制音频命令
  34.         val command = buildString {
  35.             append("-f avfoundation ")  // iOS/macOS
  36.             append("-i :0 ")            // 默认音频输入设备
  37.             append("-acodec aac ")      // 音频编码器
  38.             append("-ar 44100 ")        // 采样率
  39.             append("-ac 2 ")            // 双声道
  40.             append("-b:a 128k ")        // 音频比特率
  41.             append(outputFile)
  42.         }
  43.         
  44.         // Android 平台可能需要不同的命令格式
  45.         val androidCommand = "-f android_camera -i 0 -acodec aac -ar 44100 -ac 1 $outputFile"
  46.         
  47.         recordingSession = FFmpegKit.executeAsync(androidCommand) { session ->
  48.             if (ReturnCode.isSuccess(session.returnCode)) {
  49.                 // 录制完成
  50.                 runOnUiThread {
  51.                     // 处理录制完成的逻辑
  52.                 }
  53.             } else {
  54.                 // 录制出错
  55.                 runOnUiThread {
  56.                     // 处理错误
  57.                 }
  58.             }
  59.         }
  60.     }
  61.    
  62.     private fun stopAudioRecording() {
  63.         recordingSession?.let {
  64.             FFmpegKit.cancel(it.sessionId)
  65.         }
  66.     }
  67.    
  68.     override fun onRequestPermissionsResult(
  69.         requestCode: Int,
  70.         permissions: Array<out String>,
  71.         grantResults: IntArray
  72.     ) {
  73.         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  74.         
  75.         if (requestCode == PERMISSION_REQUEST_CODE) {
  76.             if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
  77.                 startAudioRecording()
  78.             }
  79.         }
  80.     }
  81. }
复制代码
自定义录音参数:
  1. class AudioRecorderConfig {
  2.     // 不同质量的录音配置
  3.     fun getRecordingCommand(
  4.         outputPath: String,
  5.         quality: RecordingQuality = RecordingQuality.MEDIUM
  6.     ): String {
  7.         return when (quality) {
  8.             RecordingQuality.HIGH -> {
  9.                 "-f android_camera -i 0 -acodec aac -ar 48000 -ac 2 -b:a 192k $outputPath"
  10.             }
  11.             RecordingQuality.MEDIUM -> {
  12.                 "-f android_camera -i 0 -acodec aac -ar 44100 -ac 2 -b:a 128k $outputPath"
  13.             }
  14.             RecordingQuality.LOW -> {
  15.                 "-f android_camera -i 0 -acodec aac -ar 22050 -ac 1 -b:a 64k $outputPath"
  16.             }
  17.         }
  18.     }
  19.    
  20.     enum class RecordingQuality {
  21.         HIGH, MEDIUM, LOW
  22.     }
  23. }
复制代码


注意事项
1、平台差异: Android 和 iOS 平台的 FFmpeg 命令参数可能不同
2、权限处理: 确保获取了必要的录音权限
3、设备兼容性: 不同设备的音频输入格式可能不同
4、性能考虑: 长时间录音可能影响设备性能
5、存储管理: 注意录音文件的存储位置和大小管理
通过以上代码,您可以使用 ffmpeg-kit 实现麦克风录音功能,并根据需要调整录音质量和格式。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-10-25 19:50 , Processed in 0.011715 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表