iOS split solid bx 唯一aas
iOS split stereo mp3 to mono aac
我正在 iOS 上使用以下代码将 mp3 转换为 m4a:
但我需要将左右声道提取到单独的 m4a 文件中。
我有这段代码在工作,它将我的音频拆分成 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
但是现在我需要将其转换为 CMSampleBuffer,以便我可以附加到资产编写器。如何将 nsdata 转换为样本缓冲区?
11 月 24 日更新
我现在有以下代码试图将 NSData 转换为 CMSampleBuffer。我不知道它失败的地方:
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!)
我们终于成功了!这是我们用来将 nsdata 转换为样本缓冲区的最终 swift 代码:
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
}
我正在 iOS 上使用以下代码将 mp3 转换为 m4a:
但我需要将左右声道提取到单独的 m4a 文件中。
我有这段代码在工作,它将我的音频拆分成 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
但是现在我需要将其转换为 CMSampleBuffer,以便我可以附加到资产编写器。如何将 nsdata 转换为样本缓冲区?
11 月 24 日更新 我现在有以下代码试图将 NSData 转换为 CMSampleBuffer。我不知道它失败的地方:
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!)
我们终于成功了!这是我们用来将 nsdata 转换为样本缓冲区的最终 swift 代码:
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
}