2014-06-25 7 views
3

iOS 8 베타의 새로운 AVFoundation 프레임 워크를 사용하여 AVAudioEngine 및 AVAudioFile을 사용하여 데이터를 쓰는 데 문제가 있습니다.AVFoundation : AVAudioEngine 및 AVAudioFile을 사용하는 변형 된 .m4a 파일 형식

m4a 형식을 사용하는 입력 노드의 탭을 사용하여 데이터를 쓰고 싶습니다. 사람이 할 수있는 경우

import Foundation 
import AVFoundation 

func captureMicrophoneInput() { 
    var error : NSError? 

    var audioFileSettings = Dictionary<NSObject, AnyObject>() 
    audioFileSettings[AVFormatIDKey]     = kAudioFormatMPEG4AAC 
    audioFileSettings[AVNumberOfChannelsKey]   = 1 
    audioFileSettings[AVSampleRateKey]    = 44100.0 
    audioFileSettings[AVEncoderBitRatePerChannelKey] = 16 
    audioFileSettings[AVEncoderAudioQualityKey]  = AVAudioQuality.Medium.toRaw() 

    let audioEngine = AVAudioEngine() 
    let inputNode = audioEngine.inputNode 

    // by using .acc the output file can be played successfully 
    let url : CFURL = NSURL.fileURLWithPath("/path/to/outputdir/myFileWithProblematicExtension.m4a") as CFURL 
    var audioFile = AVAudioFile(forWriting: url, settings: audioFileSettings, error: &error) 

    if error != nil { 
     println("AVAudioFile error") 
     println(error) 
     return 
    } 

    // Write the output of the input node to disk 
    inputNode.installTapOnBus(0, bufferSize: 4096, 
            format: inputNode.outputFormatForBus(0), 
             block: { (audioPCMBuffer : AVAudioPCMBuffer!, audioTime : AVAudioTime!) in 
     audioFile.writeFromBuffer(audioPCMBuffer, error: &error) 

     if error != nil { 
      println("AVAudioFile error") 
      println(error) 
      return 
     } 
    })  

    audioEngine.startAndReturnError(&error) 
} 

내가 행복 할 것이다 : 그러나, 출력 파일은 파일이 잘 형성하고 성공적으로 재생할 수 있습니다 손상,하지만 동일한 설정으로는 .aac 할 수있는 파일 형식을 변경하는 것 같다 이것에 대한 약간의 정보를 제공하십시오. 감사!

+1

을 내가 찾을 수

유일한 해결 방법은 오브젝티브 C 도우미 함수의 설정 사전을 구축하는 것이 었습니다 ID가 17495706 인 버그가 Apple에 제출되었습니다. – borrel

+0

AVFormatIDKey에 kAudioFormatAppleLossless를 사용하도록 설정을 변경 했습니까? –

+0

이것을 해결할 수 있었습니까? 나는 똑같은 문제를 겪고있다. .acc는 잘 작동하지만 .m4a는 – andlin

답변

0

내 Swift 코드는 XCode 6.0/Swift 1.0 GM에서 MPEG4AAC 형식으로 기록 할 수 없습니다. 분명히 상수 인 kAudioFormatMPEG4AAC는 여전히 부적절하게 정의되어 있습니다. 파일이 생성되었지만 오디오 샘플이 채워지지 않았습니다.

+ (NSDictionary *)getRecorderSettings 
{ 
    return @{AVFormatIDKey: @(kAudioFormatMPEG4AAC), 
      AVNumberOfChannelsKey: @(1), 
      AVSampleRateKey:@(22050), 
      AVEncoderAudioQualityKey: @(AVAudioQualityHigh)}; 
} 

과 AVAudioRecorder 초기화 스위프트 코드로이 다시 전달 :

_recorder = AVAudioRecorder(URL: fileURL, settings: recsettings, error: &initRecorderError) 
+1

이 아닙니다. 해결 방법은 필요하지 않습니다. 또한 신속한 코드에서 NSNumber를 만들 수도 있습니다. 예 : [AVFormatIDKey : NSNumber (unsignedInt : kAudioFormatMPEG4AAC), AVNumberOfChannelsKey : NSNumber (unsignedInt : 2), AVSampleRateKey : NSNumber (double : 44100.0)]와 같은 것이 제대로 작동합니다. – zliw

+0

오디오 데이터를 가져 오기 위해 AVAudioRecorder를 만들 필요가 없습니다. 단순히 마이크를 두드리는 것입니다. – user3344977