2015-11-13 20 views
6

ich eine MP3-Format m4a auf iOS mit diesem Code konvertieren: iOS swift convert mp3 to aaciOS Split-Stereo-mp3 auf Mono aac

aber ich brauche den linken und rechten Kanal in separate m4a-Dateien zu extrahieren.

Ich habe diesen Code arbeiten, das meine Audio in NSData spaltet:

let leftdata:NSMutableData! = NSMutableData() 
let rightdata:NSMutableData! = NSMutableData() 

let buff: CMBlockBufferRef = CMSampleBufferGetDataBuffer(sampleBuffer!)! 

var lengthAtOffset: size_t = 0 
var totalLength:Int = 0 
var data: UnsafeMutablePointer<Int8> = nil 

if(CMBlockBufferGetDataPointer(buff, 0, &lengthAtOffset, &totalLength, &data) != noErr) { 
    print("some sort of error happened") 
} else { 

    for i in 0.stride(to: totalLength, by: 2) { 

     if(i % 4 == 0) { 
      leftdata.appendBytes(data+i, length: 2) 
     } else { 
      rightdata.appendBytes(data+i, length: 2) 
     } 

    } 
} 

data = nil 

aber jetzt muss ich es CMSampleBuffer des umgewandelt, so kann ich an den Vermögens Schreiber anhängen. Wie konvertiere ich die Nsdata in Beispielpuffer?

Update 24. Nov Ich habe jetzt den folgenden Code, der versucht, die NSData zu einem CMSampleBuffer zu konvertieren. Ich kann nicht herausfinden, wo es scheitert:

var dataPointer: UnsafeMutablePointer<Void> = UnsafeMutablePointer(leftdata.bytes) 

var cmblockbufferref:CMBlockBufferRef? 

var status = CMBlockBufferCreateWithMemoryBlock(nil, dataPointer, leftdata.length, kCFAllocatorNull, nil, 0, leftdata.length, 0, &cmblockbufferref) 

var audioFormat:AudioStreamBasicDescription = AudioStreamBasicDescription() 
audioFormat.mSampleRate = 44100 
audioFormat.mFormatID = kAudioFormatLinearPCM 
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian 
audioFormat.mBytesPerPacket = 2 
audioFormat.mFramesPerPacket = 1 
audioFormat.mBytesPerFrame = 2 
audioFormat.mChannelsPerFrame = 1 
audioFormat.mBitsPerChannel = 16 
audioFormat.mReserved = 0 

var format:CMFormatDescriptionRef? 

status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &audioFormat, 0, nil, 0, nil, nil, &format); 

var timing:CMSampleTimingInfo = CMSampleTimingInfo(duration: CMTimeMake(1, 44100), presentationTimeStamp: kCMTimeZero, decodeTimeStamp: kCMTimeInvalid) 

var leftSampleBuffer:CMSampleBufferRef? 

status = CMSampleBufferCreate(kCFAllocatorDefault, cmblockbufferref, true, nil, nil, format, leftdata.length, 1, &timing, 0, nil, &leftSampleBuffer) 

self.assetWriterAudioInput.appendSampleBuffer(leftSampleBuffer!) 

Antwort

2

Wir haben endlich das zur Arbeit! Hier ist der letzte schnelle Code, den wir verwenden, um nsdata in einen Sample-Puffer zu konvertieren:

func NSDataToSample(data:NSData) -> CMSampleBufferRef? { 

    var cmBlockBufferRef:CMBlockBufferRef? 

    var status = CMBlockBufferCreateWithMemoryBlock(nil, nil, data.length, nil, nil, 0, data.length, 0, &cmBlockBufferRef) 

    if(status != 0) { 
     return nil 
    } 

    status = CMBlockBufferReplaceDataBytes(data.bytes, cmBlockBufferRef!, 0, data.length) 

    if(status != 0) { 
     return nil 
    } 

    var audioFormat:AudioStreamBasicDescription = AudioStreamBasicDescription() 

    audioFormat.mSampleRate = 44100 
    audioFormat.mFormatID = kAudioFormatLinearPCM 
    audioFormat.mFormatFlags = 0xc 
    audioFormat.mBytesPerPacket = 2 
    audioFormat.mFramesPerPacket = 1 
    audioFormat.mBytesPerFrame = 2 
    audioFormat.mChannelsPerFrame = 1 
    audioFormat.mBitsPerChannel = 16 
    audioFormat.mReserved = 0 

    var format:CMFormatDescriptionRef? 

    status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &audioFormat, 0, nil, 0, nil, nil, &format) 

    if(status != 0) { 
     return nil 
    } 

    var sampleBuffer:CMSampleBufferRef? 

    status = CMSampleBufferCreate(kCFAllocatorDefault, cmBlockBufferRef!, true, nil, nil, format, data.length/2, 0, nil, 0, nil, &sampleBuffer) 

    if(status != 0) { 
     return nil 
    } 

    return sampleBuffer 
}