- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试开发从服务器播放流式 PCM 数据的应用。
我使用过 AudioQueue,但效果不佳。
PCM 数据格式(来自服务器):
Sample rate = 48000, num of channel = 2, Bit per sample = 16
并且,服务器不会将固定字节流式传输到客户端。
(流式可变字节。例如:30848、128、2764,...字节)
我的源代码:
在这里,ASBD 构建我设置的内容并创建音频队列对象(语言:Swift)
// Create ASBD structure & set properties.
var streamFormat = AudioStreamBasicDescription()
streamFormat.mSampleRate = 48000
streamFormat.mFormatID = kAudioFormatLinearPCM
streamFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked
streamFormat.mFramesPerPacket = 1
streamFormat.mChannelsPerFrame = 2
streamFormat.mBitsPerChannel = 16
streamFormat.mBytesPerFrame = (streamFormat.mBitsPerChannel / 8) * streamFormat.mChannelsPerFrame
streamFormat.mBytesPerPacket = streamFormat.mBytesPerFrame
streamFormat.mReserved = 0
// Create AudioQueue for playing PCM streaming data.
var err = AudioQueueNewOutput(&streamFormat, self.queueCallbackProc, nil, nil, nil, 0, &aq)
...
我已经像上面那样设置了 ASBD 结构并创建了 AudioQueue 对象。
AudioQueue 可以很好地播放流式 PCM 数据几秒钟,
但很快播放声音就断断续续了。我能做什么?
(仍在流式传输,并排队 AudioQueue)
请给我任何想法。
最佳答案
你需要(至少)做两件事:
您需要缓冲数据以处理来自服务器的数据与音频队列回调请求的数据之间的延迟抖动和不同的数据包大小。一个典型的解决方案涉及使用循环 fifo/缓冲区,预先填充一定数量的数据,足以处理最糟糕的网络抖动情况(您需要统计分析这个数字)。音频队列回调可以从循环 fifo 中复制请求的数据量。网络代码试图让它充满。
当两个比率不够相同时,您可能还需要一些方法来隐藏错误:例如一些在网络速率太慢时复制或合成额外声音的方法,以及一些在网络速率太高时省略样本的方法,这两种方法都试图尽可能地听不见并且不会在任何速率不连续或网络辍学。
关于ios - 如何在 iOS 中播放来自服务器的流式 PCM 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40733147/
以下代码适用于某些 wav 文件,但对于其他文件,我得到“InvalidOperationException 未处理。Message=Sound API 仅支持播放 PCM wave 文件。” var
我正在尝试实现 AudioRecord (MIC) -> PCM -> AAC Encoder AAC -> PCM Decode -> AudioTrack?? (SPEAKER) 在 Andro
我想在我的 android 录音应用程序中实现使用 PCM 16 位和 PCM 8 位进行录音的可能性。我在将 byte[] PCM 16 位转换为 8 位时遇到问题,我尝试了不同的方法,但是录音的大
如何将无符号的 8 位 PCM 流 (0-255) 转换为有符号的 8 位 PCM 流 (-128-127)。从每个无符号字节中减去 128 让 0 变成 -128 和 255 变成 127 这么简单
问题与此有关 pydub-Issue .他们告诉我错误信息与 pyaudio 有关。 #!/usr/bin/env python3 import pydub, pydub.playback wav =
我无法在 C++ 中的 16 位缩放 PCM 数据和浮点 PCM 数据之间进行转换。我认为我必须接近,因为输出音频有点类似于我的预期,但它是失真的。 我这样做的原因是因为我在浏览器中运行 ScummV
从this question开始让我了解如何去交错 16 位 PCM 数据的左右声道。 我现在的问题是,如何将 8 位 PCM 解交错并“拉伸(stretch)”为 16 位值 最佳答案 16 位 P
我想添加一些噪音 44100 Hz 2 channel 16 bit interleaved PCM 我正在生成 1 秒的 440Hz 噪声并将其存储在噪声缓冲区中: #define SAMPLING
我是这里的新手。 我想知道任何工具/快速方法来转换具有 3 字节 PCM 样本的 24 位 PCM 原始( headless )文件, 成一个 32 位 PCM 原始文件,每个样本有 4 个字节,4
我已将已签名的单声道 16 位 PCM 音频样本存储在 SInt16 缓冲区中,我正在尝试将它们转换为存储在 UInt8 缓冲区中的未签名的单声道 8 位 PCM 样本。我编写了以下基本工作代码: f
我正在使用 libao 和 libsndfile 来读取和播放音频。我想通过将一个 channel 复制为两个来将单声道流转换为立体声流。此测试代码将正确播放立体声剪辑,但会非常快速和高音播放单声道剪
我正在致力于捕获音频并将其流式传输到 RTMP 服务器。我在 MacOS 下工作(在 Xcode 中),因此为了捕获音频样本缓冲区,我使用 AVFoundation 框架。但对于编码和流媒体,我需要使
我正在尝试从文本到语音接口(interface) (MaryTTS) 获取音频流并将其流式传输到 SIP RTP session 中(使用 Peers)。 同行想要 SoundSource流式传输音频
我已将录制的音频原始 PCM 保存到文件 rxrawpcm.pcm 中,之后我尝试播放 pcm 文件但无法播放录制的 PCM?我没有听到录音,只听到嗡嗡声 配置 AudioRecorder 和 Aud
我有一些原始 PCM 音频文件。我可以成功地从这些文件中读取字节流,并通过接受 PCM 数据作为输入的音频播放机制来播放它们。 当我从这些文件中读取数据时,我将其存储在字节[]中。这些轨道具有相同的大
我正在使用 C++ 进行声波模拟,我从 wav 文件中获取原始 PCM 数据并对其应用一些计算然后我想实时播放它我还想在用户更改一些时重新计算这些数据模拟中的值(如他的位置)。 我尝试了 Portau
我想在 Discord 语音 channel 中录制音频并使用 Discord 机器人将其保存到文件中。 我每 20 毫秒接收一次音频作为 pcm 编码的字节 [],我想将其保存到文件中。MP3 是首
我正在使用 AudioRecord 类来分析麦克风中的原始 pcm 字节。 所以这很好用。现在我需要将 pcm 字节转换为分贝。 我有一个公式可以将 Pa 中的声压转换为 db。 db = 20 *
我使用 oboe在我的 ndk 库中播放声音,我使用 OpenSL with Android extensions将 wav 文件解码为 PCM。解码后的签名 16 位 PCM 存储在内存中 ( st
我可以访问 PCM 音频缓冲区的音频流。我应该清楚我无权访问音频文件。我只能访问 4096 字节的音频数据 block 流。 PCM 缓冲区采用以下格式: PCM 国际 16 小端 两个 channe
我是一名优秀的程序员,十分优秀!