首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS分割立体声mp3到单声aac

iOS分割立体声mp3到单声aac
EN

Stack Overflow用户
提问于 2015-11-13 00:18:47
回答 1查看 631关注 0票数 7

我使用以下代码将mp3转换为m4a on iOS:iOS swift convert mp3 to aac

但我需要将左通道和右通道提取到单独的m4a文件中。

我有这样的代码,它可以将我的音频分割成nsdata:

代码语言:javascript
复制
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转换为示例缓冲区?

Update24Nov我现在得到了以下代码,它试图将NSData转换为CMSampleBuffer。我不知道它的缺点是什么:

代码语言:javascript
复制
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!)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-24 23:54:58

我们终于成功了!下面是我们用于将nsdata转换为samplebuffer的最终快速代码:

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33683882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档