【发布时间】:2015-02-10 22:41:09
【问题描述】:
我有一些非常奇怪的东西(至少对我来说,但我是菜鸟)。
UInt32 numBytesReadFromFile;
OSStatus err = AudioFileReadPacketData(
audioFile, // The audio file whose audio packets you want to read.
NO, // is cache set?
&numBytesReadFromFile, // On output, the number of bytes of audio data that were read from the audio file.
(AudioStreamPacketDescription *)_packetDescriptions, // array of packet descriptions of data that was read from the audio file (for CBR null)
currentPacket, // the next packet to be read into buffer
&numPackets, // number of actually read buffers
_audioQueueBuffer->mAudioData
);
AudioFileReadPacketData 从音频文件中读取数据并将其放入缓冲区中。
所以我的问题是关于参数 numBytesReadFromFile。 Apple writes
numBytesReadFromFile:输出时,从音频文件中读取的音频数据字节数。
到目前为止一切顺利。 Apple 在上面的示例代码中声明 numBytesReadFromFile 但对我来说这行代码崩溃了!我得到一个 EXC BAD ACCESS。
UInt32 numBytesReadFromFile;
我需要像这样声明 numBytesReadFromFile 并且一切正常:
UInt32 numBytesReadFromFile = 2048; // 2048 = size of my buffer
不过这也会崩溃
UInt32 numBytesReadFromFile = 12
UInt32 numBytesReadFromFile = sizeof(UInt32)
但这不是
UInt32 numBytesReadFromFile = 1021; // a random number
我不是一个非常有经验的 C 程序员,但据我所知,我通过声明 numBytesReadFromFile 和方法 audiofilereadpacketdata 将其数据写入变量的地址来保留一些内存。如果我错了,请纠正我。
那么为什么会崩溃呢?我想我还没有解决真正的问题。
我的假设是我有某种多线程问题。当我准备队列时,我在主线程上调用 AudioFileReadPacketData 并声明
UInt32 numBytesReadFromFile;
工作正常。我开始播放音频并调用了一个回调,该回调在音频队列的内部后台线程上调用 AudioFilereadPacketData 并发生上述错误。如果我的假设是正确的,由于我在多线程方面没有经验,有人可以更详细地解释一下这个问题。
谢谢。
【问题讨论】:
-
请发布更多代码。
ioNumBytes最初是什么?它与您的缓冲区大小匹配吗? -
没有更多代码了。一切都为 AudioFileReadDataPack 设置好了。只需要声明 numBytesReadFromFile 并且在调用 AudioFileReadDataPack 之前完成。
标签: ios core-audio exc-bad-access audioqueue