###前提・実現したいこと
CMSampleBufferクラスで44100hzの音声データを取り込んでも5hzほどでしかとれない
###発生している問題・エラーメッセージ
swiftで音楽データを取り込んでみようと思い、CMSampleBufferクラスを使ってデータサンプルをとってみたのですが、本来の音声データ(mp3)のサンプリング周波数が44100hzに対して、取り込んだ音声データは5hzほどしかないという状況です。海外のサイトも閲覧しましたが、わかりませんでした。詳しい方、ご教授お願いします。
エラーメッセージ
###該当のソースコード
swift
//mp3データを取得
let sineURL = NSBundle.mainBundle().URLForResource("SUPER", withExtension: "mp3")!
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() let sampleData = NSMutableData() //サンプリングしたデータを格納する配列 var arraySamples = [Int16]() //読み込むデータが無くなるまで、つまり終端のデータまで読み込みつづける。 while assetReader.status == AVAssetReaderStatus.Reading {
//copyNextSampleBuffer:次のサンプルに進む?
if let sampleBufferRef = trackOutput.copyNextSampleBuffer() {
//samplebufferRefのprint結果については後述。
print(sampleBufferRef)
if let blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef) { let bufferLength = CMBlockBufferGetDataLength(blockBufferRef) let data = NSMutableData(length: bufferLength) CMBlockBufferCopyDataBytes(blockBufferRef, 0, bufferLength, data!.mutableBytes) let samples = UnsafeMutablePointer<Int16>(data!.mutableBytes) sampleData.appendBytes(samples, length: bufferLength) CMSampleBufferInvalidate(sampleBufferRef) if(samples.memory < -32766 || samples.memory > 32766){ arraySamples.append(32767) } else{ arraySamples.append(samples.memory) } } } }
###試したこと
arraySamples.append(samples.memory)の回数を計算すると、240秒のデータ量でだいたい1200個のsamplesが得られました。これではたったの5hzしかサンプリングできていないのです。
###補足情報(言語/FW/ツール等のバージョンなど)
print(sampleBufferRef)の結果です。
CMSampleBuffer 0x7fcbe3e215f0 retainCount: 6 allocator: 0x10dbeca40
invalid = NO
dataReady = YES
makeDataReadyCallback = 0x0
makeDataReadyRefcon = 0x0
formatDescription = <CMAudioFormatDescription 0x7fcbe3e4b290 [0x10dbeca40]> {
mediaType:'soun'
mediaSubType:'lpcm'
mediaSpecific: {
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xc
mBytesPerPacket: 4
mFramesPerPacket: 1
mBytesPerFrame: 4
mChannelsPerFrame: 2
mBitsPerChannel: 16 }
cookie: {(null)}
ACL: {(null)}
}
extensions: {(null)}
}
sbufToTrackReadiness = 0x0
numSamples = 8192
sampleTimingArray[1] = {
{PTS = {0/44100 = 0.000}, DTS = {INVALID}, duration = {1/44100 = 0.000}},
}
sampleSizeArray[1] = {
sampleSize = 4,
}
dataBuffer = 0x7fcbe3e55020
この下から8行目のnumSamples = 8912の分がまとめて一つのデータとして入っているのではないかと考えられるのですが、この値を変える方法がわかりません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/04 15:55 編集
2016/05/04 16:07 編集
2016/05/04 17:46 編集
2016/05/05 01:04
2016/05/05 02:50