2015-11-13 24 views
6

Sto conversione di un MP3 in M4A su iOS con questo codice: iOS swift convert mp3 to aaciOS mp3 diviso stereo a mono aac

ma ho bisogno di estrarre il canale sinistro e destro in file m4a separati.

Ho questo lavoro codice che sta dividendo il mio audio in NSData:

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 

Comunque ora ho bisogno convertito in CMSampleBuffer di modo che io possa aggiungere allo scrittore risorsa. Come posso convertire gli nsdata per campionare i buffer?

Aggiornamento 24 novembre ora ho il seguente codice thats di cercare di convertire la NSData ad un CMSampleBuffer. Non riesco a capire dove fallisce:

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!) 

risposta

2

Finalmente abbiamo funzionato! Ecco il codice swift finale che stiamo usando per convertire nsdata in un samplebuffer:

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 
}