Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Audiokit录制文件大小太大_Ios_Swift_Audiokit - Fatal编程技术网

Ios Audiokit录制文件大小太大

Ios Audiokit录制文件大小太大,ios,swift,audiokit,Ios,Swift,Audiokit,类似于(截至目前已有一年没有答案) 以下是我设置录音机和播放机的方式: AKAudioFile.cleanTempDirectory() // Session settings AKSettings.bufferLength = .medium AKSettings.sampleRate = AudioKit.engine.inputNode.inputFormat(forBus: 0).sampleRate mic = AKMi

类似于(截至目前已有一年没有答案)

以下是我设置录音机和播放机的方式:

AKAudioFile.cleanTempDirectory()

        // Session settings
        AKSettings.bufferLength = .medium
        AKSettings.sampleRate = AudioKit.engine.inputNode.inputFormat(forBus: 0).sampleRate
        mic = AKMicrophone()!
        do {
            try AKSettings.setSession(category: .playAndRecord, with: .defaultToSpeaker)
        } catch {
            AKLog("Could not set session category.")
        }

        AKSettings.defaultToSpeaker = true

        // Patching
        let monoToStereo = AKStereoFieldLimiter(mic, amount: 1)
        micMixer = AKMixer(monoToStereo)
        micBooster = AKBooster(micMixer)

        // Will set the level of microphone monitoring
        micBooster.gain = 0
        recorder = try? AKNodeRecorder(node: micMixer)
        if let audio = audioFile {
            player = AKPlayer(audioFile: audio)
        }
        else if let file = recorder.audioFile {
            player = AKPlayer(audioFile: file)
        }
        player.isLooping = false
        player.completionHandler = playingEnded

        moogLadder = AKMoogLadder(player)

        mainMixer = AKMixer(moogLadder, micBooster)

        AudioKit.output = mainMixer
        do {
            try AudioKit.start()
        } catch {
            AKLog("AudioKit did not start!")
        }
        self.plot?.node = self.mic
以下是我导出音频的方式:

tape = recorder.audioFile!
player.load(audioFile: tape)
let fileName = self.primaryRecording.replacingOccurrences(of: ".wav", with: ".caf")
tape.exportAsynchronously(name: fileName,
                      baseDir: .documents,
                      exportFormat: .caf) {file, exportError in
if let error = exportError {
    AKLog("Export Failed \(error)")
    exported(false)
}
else {}
问题是这里的规模很大。长度为2:15的音频文件大约需要51MB。我知道我必须降低采样率和缓冲区大小等,以减少大小,例如:

    AudioStreamBasicDescription myPCMFormat;
    myPCMFormat.mSampleRate = 8000.0;
    myPCMFormat.mChannelsPerFrame = 1;
    myPCMFormat.mFramesPerPacket = 1;
    myPCMFormat.mBitsPerChannel = 16;
    myPCMFormat.mBytesPerPacket = 2;
    myPCMFormat.mBytesPerFrame = 2;
    myPCMFormat.mReserved = 0;
func getAKConverterOptions()-> AKConverter.Options{
        var options = AKConverter.Options()
        // any options left nil will assume the value of the input file
        options.format = "wav"
        options.sampleRate = 8000
        options.bitRate = 16
        options.channels = 1
        options.bitDepth = 16
        options.eraseFile = true
        options.isInterleaved = true
        return options
    }
但如果我设定:

AKSettings.sampleRate = 8000
它崩溃了。为了运行Audiokit,我必须编写以下内容:

   AKSettings.sampleRate = AudioKit.engine.inputNode.inputFormat(forBus: 0).sampleRate
    mic = AKMicrophone()

如果我这样做,采样率是48000,由此产生的文件是巨大的。如何将文件大小减小到1分钟的音频需要1 MB?下面是一个示例项目

这可能不是正确的方法,但我已设法将1分钟的录制时间减少到975kb。我刚刚使用AKConverter将生成的caf文件转换为wav文件,如下所示:

    AudioStreamBasicDescription myPCMFormat;
    myPCMFormat.mSampleRate = 8000.0;
    myPCMFormat.mChannelsPerFrame = 1;
    myPCMFormat.mFramesPerPacket = 1;
    myPCMFormat.mBitsPerChannel = 16;
    myPCMFormat.mBytesPerPacket = 2;
    myPCMFormat.mBytesPerFrame = 2;
    myPCMFormat.mReserved = 0;
func getAKConverterOptions()-> AKConverter.Options{
        var options = AKConverter.Options()
        // any options left nil will assume the value of the input file
        options.format = "wav"
        options.sampleRate = 8000
        options.bitRate = 16
        options.channels = 1
        options.bitDepth = 16
        options.eraseFile = true
        options.isInterleaved = true
        return options
    }
导出后,我将其转换为:

let converter = AKConverter(inputURL: self.getFilePath(name: self.baseRecording.replacingOccurrences(of: ".wav", with: ""), extension: "caf"), outputURL: self.getFilePath(name: self.baseRecording.replacingOccurrences(of: ".wav", with: ""), extension: "wav"), options: self.getAKConverterOptions())
converter.start { (error) in
         if error == nil {
                   exported(true)
         }
         else{
                  exported(false)
         }
}

这可能不是正确的方法,但我已经设法将1分钟的录制减少到975kb大小。我刚刚使用AKConverter将生成的caf文件转换为wav文件,如下所示:

    AudioStreamBasicDescription myPCMFormat;
    myPCMFormat.mSampleRate = 8000.0;
    myPCMFormat.mChannelsPerFrame = 1;
    myPCMFormat.mFramesPerPacket = 1;
    myPCMFormat.mBitsPerChannel = 16;
    myPCMFormat.mBytesPerPacket = 2;
    myPCMFormat.mBytesPerFrame = 2;
    myPCMFormat.mReserved = 0;
func getAKConverterOptions()-> AKConverter.Options{
        var options = AKConverter.Options()
        // any options left nil will assume the value of the input file
        options.format = "wav"
        options.sampleRate = 8000
        options.bitRate = 16
        options.channels = 1
        options.bitDepth = 16
        options.eraseFile = true
        options.isInterleaved = true
        return options
    }
导出后,我将其转换为:

let converter = AKConverter(inputURL: self.getFilePath(name: self.baseRecording.replacingOccurrences(of: ".wav", with: ""), extension: "caf"), outputURL: self.getFilePath(name: self.baseRecording.replacingOccurrences(of: ".wav", with: ""), extension: "wav"), options: self.getAKConverterOptions())
converter.start { (error) in
         if error == nil {
                   exported(true)
         }
         else{
                  exported(false)
         }
}