- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个基于 CoreAudio 的 FLAC 播放器,遇到了一个与 AudioQueues 相关的棘手问题。我正在像这样初始化我的东西(以下划线开头的变量是实例变量):
_flacDecoder = FLAC__stream_decoder_new();
AudioStreamBasicDescription asbd = {
.mFormatID = kAudioFormatLinearPCM,
.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked,
.mSampleRate = 44100,
.mChannelsPerFrame = 2,
.mBitsPerChannel = 16,
.mBytesPerPacket = 4,
.mFramesPerPacket = 1,
.mBytesPerFrame = 4,
.mReserved = 0
};
AudioQueueNewOutput(&asbd, HandleOutputBuffer, (__bridge void *)(self), CFRunLoopGetCurrent(), kCFRunLoopDefaultMode, 0, &_audioQueue);
for (int i = 0; i < kNumberBuffers; ++i) {
AudioQueueAllocateBuffer(_audioQueue, 0x10000, &_audioQueueBuffers[i]);
}
AudioQueueSetParameter(_audioQueue, kAudioQueueParam_Volume, 1.0);
44.1 kHz 的 16 位立体声 PCM,非常基本的设置。 kNumberBuffers 为 3,每个缓冲区为 0x10000 字节。我用这些回调填充缓冲区:
static void HandleOutputBuffer(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer){
FLACPlayer * self = (__bridge FLACPlayer*)inUserData;
UInt32 largestBlockSizeInBytes = self->_currentStreamInfo.max_blocksize * self->_currentStreamInfo.channels * self->_currentStreamInfo.bits_per_sample/8;
inBuffer->mAudioDataByteSize = 0;
self->_buffer = inBuffer;
while(inBuffer->mAudioDataByteSize <= inBuffer->mAudioDataBytesCapacity - largestBlockSizeInBytes){
FLAC__bool result = FLAC__stream_decoder_process_single(self->_flacDecoder);
assert(result);
if(FLAC__stream_decoder_get_state(self->_flacDecoder) == FLAC__STREAM_DECODER_END_OF_STREAM){
AudioQueueStop(self->_audioQueue, false);
break;
}
}
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
}
static FLAC__StreamDecoderWriteStatus flacDecoderWriteCallback(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data){
FLACPlayer * self = (__bridge FLACPlayer *)client_data;
assert(frame->header.bits_per_sample == 16); // TODO
int16_t * bufferWritePosition = (int16_t*)((uint8_t*)self->_buffer->mAudioData + self->_buffer->mAudioDataByteSize);
for(int i = 0; i < frame->header.blocksize; i++){
for(int j = 0; j < frame->header.channels; j++){
*bufferWritePosition = (int16_t)buffer[j][i];
bufferWritePosition++;
}
}
int totalFramePayloadInBytes = frame->header.channels * frame->header.blocksize * frame->header.bits_per_sample/8;
self->_buffer->mAudioDataByteSize += totalFramePayloadInBytes;
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}
static void flacDecoderMetadataCallback(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data){
FLACPlayer * self = (__bridge FLACPlayer*) client_data;
if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO){
self->_currentStreamInfo = metadata->data.stream_info;
}
}
基本上,当队列请求新缓冲区时,我从 FLAC__stream_decoder 填充缓冲区,然后将其入队。就像其他人一样。当 libFLAC 告诉我已经到达文件末尾时,我告诉 AudioQueue 异步停止,直到它消耗完所有缓冲区的内容。但是,播放并没有播放到最后,而是提前停止了一点点。如果我删除这一行:
AudioQueueStop(self->_audioQueue, false);
一切正常;音频端到端播放,尽管我的队列一直运行到时间结束。如果我将该行更改为:
AudioQueueStop(self->_audioQueue, true);
然后播放立即/同步停止,正如您从 Apple 的文档中所期望的那样:
If you pass true, stopping occurs immediately (that is, synchronously). If you pass false, the function returns immediately, but the audio queue does not stop until its queued buffers are played or recorded (that is, the stop occurs asynchronously). Audio queue callbacks are invoked as necessary until the queue actually stops.
我的问题是:- 我做错了什么吗?- 我怎样才能播放我的音频直到结束,并适本地关闭队列?
最佳答案
当然,经过几个小时的努力,我在发布这个问题几分钟后找到了解决方案......问题是 AudioQueue 不关心在调用 AudioQueueStop(..., false) 之后 排队的缓冲区。所以现在我像这样喂队列,一切都像魅力一样:
static void HandleOutputBuffer(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer){
FLACPlayer * self = (__bridge FLACPlayer*)inUserData;
UInt32 largestBlockSizeInBytes = self->_currentStreamInfo.max_blocksize * self->_currentStreamInfo.channels * self->_currentStreamInfo.bits_per_sample/8;
inBuffer->mAudioDataByteSize = 0;
self->_buffer = inBuffer;
bool shouldStop = false;
while(inBuffer->mAudioDataByteSize <= inBuffer->mAudioDataBytesCapacity - largestBlockSizeInBytes){
FLAC__bool result = FLAC__stream_decoder_process_single(self->_flacDecoder);
assert(result);
if(FLAC__stream_decoder_get_state(self->_flacDecoder) == FLAC__STREAM_DECODER_END_OF_STREAM){
shouldStop = true;
break;
}
}
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
if(shouldStop){
AudioQueueStop(self->_audioQueue, false);
}
}
关于macos - CoreAudio AudioQueue 停止问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19624605/
我正在使用 ffmpeg 从 .mov 文件中获取音频。查看我的设置,我没有转换我正在生成的音频缓冲区的采样率,因此这不太可能解决我遇到的问题。无论我在内置输出上设置的采样率如何,我的 44.1 kH
我正在使用 AVAssetReaderAudioMixOutput 读取音频文件。因此,我将获得通常包含 2*8192 个样本的 AudioBuffer 对象。现在我想对 2*44100 个样本进行一
最近我遇到了下一个问题。我使用 CoreAudio AudioUnit (RemoteI/O) 在 iOS 应用程序中播放/录制声音流。 进入音频单元的声音流是 2 channel LPCM,16 位
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
首先,一些背景信息:我正在编写一个 MacOS/X 应用程序,它使用 CoreAudio 从 CoreAudio 设备的输入流接收音频信号,对音频进行一些实时处理,然后将其发送回该 CoreAudio
我正在制作一个基于 CoreAudio 的 FLAC 播放器,遇到了一个与 AudioQueues 相关的棘手问题。我正在像这样初始化我的东西(以下划线开头的变量是实例变量): _flacDe
我目前正在尝试获取iOS应用程序的传出音频信号,以便将其发送到Audiobus。我需要传出的AudioBufferLists才能路由它们。我正在使用OpenAL进行音频播放。 最好的情况是,我什至可以
我在使用 MixerUnit 和 OutputUnit 从 AUGraph 获取音频时遇到问题。我构建了一个混合 2 个音频文件的图形。这是我创建图表的代码。我没有任何错误。 NSLog(@"init
我根本无法弄清楚这个问题。下面代码中的音频播放速度非常快且断断续续。 SO 上还有一个类似的问题,但它是针对可变比特率的,不适用。 其他站点上的一些可能的答案(直接设置每个数据包的帧数)不再起作用并给
我对音频编程还很陌生,但我知道这一定是可行的。 (这是一个 iOS/iPhone 相关的问题)。 我如何在不改变音高的情况下改变加载的音频文件的速度,然后播放它? 我想我需要深入研究 CoreAudi
我的 C++ 技能很浅,但我设法完成了工作 - 直到我碰壁。当前的墙: 我正在使用 CoreAudio 做一些 Midi 播放。我有很多工作,但我坚持做一件简单的事情。 (我不知道正确的 C++ 术语
我有一个 iPhone 应用程序正在录制音频,然后通过网络广播它。为了响应来自远端的“停止”,它排队通知以停止记录。唉,当它到达 AudioQueueStop 调用时,应用程序只是挂起(即 Stop
我需要将输出采样率从 44.1 更改为 32.0,但它总是会引发错误,Out: AudioUnitSetProperty-SF=\217\325\377\377, -10865。我不知道为什么它会让我
我在iPhone上遇到AudioTimeStamps的问题。当我在模拟器中运行应用程序时,AudioTimeStamp.mHostTime似乎以纳秒(1,000,000,000秒)为单位,而在我的设备
我有一个基于 CoreAudio 的 MacOS/X 程序,它允许用户选择一个输入音频设备和一个输出音频设备,并且(如果用户没有为输入和输出选择相同的设备)我的程序创建了一个私有(private)的聚
我有一个关于 CoreAudio 和 AVFoundation 的问题。 我使用 CoreAudio 和 AUGraph 和 AudioUnit 构建了一个专业音频应用程序。 我想切换到看起来非常棒的
我对macOS编程比较陌生,但对一般编程却不是。我宁愿使用(Objective)C / C++而不是Swift。我需要打开一个特定的音频设备进行输出,并将音频数据的实时流从网络传输到输出设备。该设备具
在我看来,CoreAudio 在混合到单个 channel 时会将声波添加到一起。我的程序将发出合成声音。我知道每种声音的振幅。当我一起玩它们时,我应该将它们加在一起并乘以合成波以保持在范围内吗?我可
我正在构建一个 CoreAudio 应用程序,我需要在其中处理来自麦克风的原始输入样本。我使用两个线程,其中一个线程从麦克风输入中生成样本,另一个线程使用样本。这些线程共享一个(工作良好的)循环缓冲区
我试过下面的代码,但在执行它时给出了'fmt?'错误告诉我“此文件类型不支持数据格式”。不幸的是,我无法在任何地方找到解释如果要写入 AIFF 应该如何设置 AudioStreamBasicDescr
我是一名优秀的程序员,十分优秀!