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