gpt4 book ai didi

ios - 将 M4A 文件转换为原始数据

转载 作者:行者123 更新时间:2023-11-29 12:16:09 24 4
gpt4 key购买 nike

我正在尝试读取声音文件的原始值。我是 IOS 开发的新手。我最终试图对音频文件进行快速傅里叶变换。数据的输出看起来像一个声波,但是当我对此处提供的蜂鸣声进行 fft 计算时 enter link description here我没有从 fft 中得到明显的频率,这让我相信我没有得到真正的原始数据。我使用多个堆栈溢出帖子的组合构建了以下代码。我读错文件了吗?

class AudioAnalyzer {
init(file_path: NSURL) {
var assetOptions = [
AVURLAssetPreferPreciseDurationAndTimingKey : 1,
AVFormatIDKey : kAudioFormatLinearPCM
]
println(file_path)
var videoAsset=AVURLAsset(URL: file_path, options: assetOptions)
var error:NSError?

var videoAssetReader=AVAssetReader(asset: videoAsset, error: &error)

if error != nil
{
println(error)
}

var tracksArray=videoAsset?.tracksWithMediaType(AVMediaTypeAudio)
var videotrack = tracksArray?[0] as! AVAssetTrack
var fps = videotrack.nominalFrameRate

var videoTrackOutput=AVAssetReaderTrackOutput(track:videotrack as AVAssetTrack , outputSettings: nil)

if videoAssetReader.canAddOutput(videoTrackOutput)
{
videoAssetReader.addOutput(videoTrackOutput)
videoAssetReader.startReading()
}

if videoAssetReader.status == AVAssetReaderStatus.Reading {

var sampleBuffer = videoTrackOutput.copyNextSampleBuffer()
var audioBuffer = CMSampleBufferGetDataBuffer(sampleBuffer)
let samplesInBuffer = CMSampleBufferGetNumSamples(sampleBuffer)
var currentZ = Double(samplesInBuffer)

let buffer: CMBlockBufferRef = CMSampleBufferGetDataBuffer(sampleBuffer)

var lengthAtOffset: size_t = 0
var totalLength: size_t = 0
var data: UnsafeMutablePointer<Int8> = nil
var output: Array<Float> = [];
if( CMBlockBufferGetDataPointer( buffer, 0, &lengthAtOffset, &totalLength, &data ) != noErr ) {
println("some sort of error happened")
} else {
for i in stride(from: 0, to: totalLength, by: 2) {
var myint = Int16(data[i]) << 8 | Int16(data[i+1])
var myFloat = Float(myint)
output.append(myFloat);
}
println(output)
}
}
}
}

最佳答案

您的AVAssetReaderTrackOutput 为您提供原始数据包数据。对于 LPCM 输出,传入一些 outputSettings:

var settings = [NSObject : AnyObject]()
settings[AVFormatIDKey] = kAudioFormatLinearPCM
settings[AVLinearPCMBitDepthKey] = 16
settings[AVLinearPCMIsFloatKey] = false

var videoTrackOutput=AVAssetReaderTrackOutput(track:videotrack as AVAssetTrack , outputSettings: settings)

附注如果您将 videoTrackOutput 重命名为 audioTrackOutput,我会感觉好多了。

关于ios - 将 M4A 文件转换为原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31952418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com