tôi là chuyển đổi một mp3 sang m4a trên iOS với mã này: iOS swift convert mp3 to aaciOS chia stereo mp3 để mono aac
nhưng tôi cần phải giải nén bên trái và kênh phải vào file m4a riêng biệt.
tôi có mã này làm việc được tách âm thanh của tôi vào 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
Tuy nhiên bây giờ tôi cần nó chuyển đổi sang CMSampleBuffer vì vậy tôi có thể gắn liền với các nhà văn tài sản. Làm cách nào để chuyển đổi nsdata thành các bộ đệm mẫu?
Cập nhật ngày 24 tháng 11 Tôi hiện đang có mã sau đây đang cố gắng chuyển đổi NSData thành CMSampleBuffer. Tôi không thể tìm ra nơi thất bại của nó:
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!)