2015-11-13 49 views
6

jestem konwersja mp3 na m4a na iOS z tym kodem: iOS swift convert mp3 to aaciOS Podział stereo MP3 do AAC mono

ale muszę wyodrębnić lewego i prawego kanału do oddzielnych plików m4a.

mam tej pracy kod, który pęka moje audio do 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 

teraz muszę to jednak przekształcić w CMSampleBuffer jest tak mogę dołączyć do pisarza aktywów. Jak przekonwertować nsdata na przykładowe bufory?

Aktualizacja 24 listopada ja teraz mam następujący kod ów próbuje przekonwertować NSData do CMSampleBuffer. Nie mogę się dowiedzieć, gdzie to się stało:

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

Odpowiedz

2

W końcu udało nam się to zrobić! Oto końcowy kod skrótu, którego używamy do konwersji nsdata do bufora próbek:

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 
}