2015-11-13 21 views
6

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

Trả lời

2

Cuối cùng, chúng tôi đã làm việc này! Dưới đây là đoạn mã nhanh cuối cùng mà chúng tôi đang sử dụng để chuyển đổi nsdata thành một templatebuffer:

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 
} 
Các vấn đề liên quan