2015-08-21 5 views
6

Я пытаюсь преобразовать пример из книги обучения ABFoundation из книги Боба Маккуэна и с некоторыми проблемами, использующими AVAssetReader и NSInputStream. График должен быть чистой синусоидальной волной, но значения как-то отражаются на оси X.Swift 2: AVAssetReader и NSInputStream Audio Graph

Я пробовал каждую итерацию обмена байтов, о которых я мог думать, и это не сработало.

площадка размещена на GitHub здесь: https://github.com/justinlevi/AVAssetReader

//: Playground - noun: a place where people can play 

import UIKit 
import AVFoundation 
import XCPlayground 

func plotArrayInPlayground<T>(arrayToPlot:Array<T>, title:String) { 
    for currentValue in arrayToPlot { 
    XCPCaptureValue(title, value: currentValue) 
    } 
} 

class SSSampleDataFilter { 
    var sampleData:NSData? 

    init(data:NSData) { 
    sampleData = data 
    } 

    func filteredSamplesForSize(size:CGSize) -> [Int]{ 
    var filterSamples = [UInt16]() 

    if let sampleData = sampleData { 
     let sampleCount = sampleData.length 
     let binSize = CGFloat(sampleCount)/size.width 

     let stream = NSInputStream(data: sampleData) 
     stream.open() 

     var readBuffer = Array<UInt8>(count: 16 * 1024, repeatedValue: 0) 
     var totalBytesRead = 0 

     let size = sizeof(UInt16) 
     while (totalBytesRead < sampleData.length) { 
     let numberOfBytesRead = stream.read(&readBuffer, maxLength: size) 
     let u16: UInt16 = UnsafePointer<UInt16>(readBuffer).memory 

     var sampleBin = [UInt16]() 
     for _ in 0..<Int(binSize) { 
      sampleBin.append(u16) 
     } 

     filterSamples.append(sampleBin.maxElement()!) 
     totalBytesRead += numberOfBytesRead 
     } 

     //plotArrayInPlayground(filterSamples, title: "Samples") 
    } 

    return [0] 

    } 
} 

let sineURL = NSBundle.mainBundle().URLForResource("440.0-sine", withExtension: "aif")! 
let asset = AVAsset(URL: sineURL) 
var assetReader:AVAssetReader 

do{ 
    assetReader = try AVAssetReader(asset: asset) 
}catch{ 
    fatalError("Unable to read Asset: \(error) : \(__FUNCTION__).") 
} 

let track = asset.tracksWithMediaType(AVMediaTypeAudio).first 
let outputSettings: [String:Int] = 
    [ AVFormatIDKey: Int(kAudioFormatLinearPCM), 
    AVLinearPCMIsBigEndianKey: 0, 
    AVLinearPCMIsFloatKey: 0, 
    AVLinearPCMBitDepthKey: 16, 
    AVLinearPCMIsNonInterleaved: 0] 

let trackOutput = AVAssetReaderTrackOutput(track: track!, outputSettings: outputSettings) 

assetReader.addOutput(trackOutput) 
assetReader.startReading() 

var sampleData = NSMutableData() 

while assetReader.status == AVAssetReaderStatus.Reading { 
    if let sampleBufferRef = trackOutput.copyNextSampleBuffer() { 
    if let blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef) { 
     let bufferLength = CMBlockBufferGetDataLength(blockBufferRef) 
     var data = NSMutableData(length: bufferLength) 
     CMBlockBufferCopyDataBytes(blockBufferRef, 0, bufferLength, data!.mutableBytes) 
     var samples = UnsafeMutablePointer<Int16>(data!.mutableBytes) 
     sampleData.appendBytes(samples, length: bufferLength) 
     CMSampleBufferInvalidate(sampleBufferRef) 
    } 
    } 
} 

let view = UIView(frame: CGRectMake(0, 0, 375.0, 667.0)) 
//view.backgroundColor = UIColor.lightGrayColor() 

if assetReader.status == AVAssetReaderStatus.Completed { 
    print("complete") 

    let filter = SSSampleDataFilter(data: sampleData) 
    let filteredSamples = filter.filteredSamplesForSize(view.bounds.size) 
} 

//XCPShowView("Bezier Path", view: view) 
XCPSetExecutionShouldContinueIndefinitely(true) 

Вот что график должен выглядеть (из Audacity) Sine wave graph of audio file

Вот что граф выглядит как на детской площадке

enter image description here

ответ

2

К сожалению, ваша игровая площадка ничего не делает для меня в Xcode7b5, однако вы просите AVAssetReaderTrackOutput дать вам подписанные 16-битные int, но ваш код обрабатывает их как unsigned UInt16 s (а файл Audacity использует поплавки).

Изменение всех экземпляров UInt16 до Int16 на вашей игровой площадке, кажется, печатает чувствительные синусоидальные данные.

+1

Странно, что он не отобразился в Xcode7b5 для вас. Вы взяли версию github, которая включала аудиофайл AIFF? Конечно же, как только я изменил все экземпляры 'UInt16' на 'Int16', все работает. –

+0

Смотрел на это вчера. Спасибо –

+0

Последующий вопрос, хотя - Любая идея, почему aif, caf, m4a все работает нормально, но mp3-версия того же аудио нет? Мне нужно вернуться к документам и посмотреть, могу ли я понять, почему, но я, хотя AVassetReader позаботился о сжатии mp3, а также –

 Смежные вопросы

  • Нет связанных вопросов^_^