- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用行为如下的第三方 API:
为了论证,我们所说的“ block ”是指数据的任意“下一部分”,不能保证它对应于音频的任何有意义的划分(例如,它可能不会与特定的多个音频帧对齐,每个 block 中的字节数只是一些任意数字,每个 block 可以不同,等等)。
现在——如果我错了,请纠正我,我不能简单地使用 AVAudioPlayer,因为我需要 POST 到我的 URL,所以我需要通过 NSURLConnection“手动”拉回数据。
那么...鉴于上述情况,当音频通过网络传输时,对我来说最轻松的播放方式是什么? (我很欣赏我可以连接所有字节数组,然后在最后将整个内容传递给 AVAudioPlayer——只是这会延迟播放的开始,因为我必须等待所有数据。)
最佳答案
我将对解决方案进行鸟瞰。我认为这将在很大程度上帮助您找到具体的编码解决方案。
iOS 提供了大量音频 API,其中一些可用于播放音频。您选择其中哪一个取决于您的特定要求。正如您已经写过的,AVAudioPlayer
类不适合您的情况,因为对于这个类,您需要在开始播放音频的那一刻就知道所有音频数据。显然,流媒体不是这种情况,因此我们必须寻找替代方案。
易用性和多功能性之间的良好平衡是 Audio Queue Services ,这是我为您推荐的。另一种选择是音频单元,但它们是低级 C API,因此使用起来不太直观,并且有很多缺陷。所以坚持使用音频队列。
音频队列允许您定义在需要更多音频数据播放时从 API 调用的回调函数 - 类似于您的网络代码的回调,当有可用数据时调用。
现在的难点是如何连接两个回调,一个提供数据,一个请求数据。为此,您必须使用缓冲区。更具体地说,一个队列(不要将此队列与音频队列的东西混淆。音频队列服务是 API 的名称。另一方面,queue I'm talking about next 是一个容器对象)。为清楚起见,我将其称为缓冲区队列。
要将数据填充到缓冲区队列中,您将使用网络回调函数,该函数从网络向您提供数据。数据将通过音频回调函数从缓冲区队列中取出,音频队列服务在需要更多数据时调用该函数。
你必须找到一个支持并发访问的缓冲区队列实现(又名它是线程安全的),因为它将从两个不同的线程访问,音频线程和网络线程。或者找到一个已经线程安全的缓冲区队列实现,你可以自己处理线程安全,例如通过在某个 dispatch queue (3rd kind of queue here; yes, Apple and IT love them) 上执行处理缓冲区队列的所有代码.
现在,如果有的话会发生什么
调用音频回调并且您的缓冲区队列为空,或者
调用网络回调并且您的缓冲区队列已满?
在这两种情况下,各自的回调函数都无法正常进行。如果没有可用的音频数据,则音频回调函数无法提供音频数据;如果缓冲区队列已满,则网络回调函数无法存储传入的数据。
在这些情况下,我会首先尝试阻止进一步执行,直到有更多数据可用或相应的空间可用于存储数据。在网络方面,这很可能会奏效。在音频方面,这可能会导致问题。如果它在音频方面引起问题,您有一个简单的解决方案:如果您没有数据,只需提供静音作为数据。这意味着您需要向音频队列服务提供零帧,它将以静默方式播放以填补空白,直到网络提供更多数据为止。这是所有流媒体播放器在音频突然停止时使用的概念,它会在某种旋转图标旁边告诉您“正在缓冲”,表示您必须等待,没人知道要等多久。
关于ios - 在 iOS 中播放通过网络连接逐渐流式传输的 WAV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502197/
如果已知该确切样本存在于 wav 中的某处(但可能与其他声音混合),是否可以使用 FFT 找到较长 wav 中出现的小 wav 样本? 编辑 (收到两个回复后):如果我有一个包含所有已知声音的库,这些
我对 .NET 中的音频完全陌生,所以请多多包涵。 我的目标是创建一个具有两个 channel 的 wav 文件。左声道将包含语音消息(使用 SpeechSynthesizer 生成的流),右声道需要
我的大部分信息都来自其他stackoverflow帖子,但没有一个真正有用。 import UIKit import AVFoundation class FaceButtonSc
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 3 年前。
这可能是一个非常简单的问题;我将一个单声道 WAV 文件转换为一个 short[] 数组,并且我有一个将其写回 WAV 文件的函数。一切正常。 (writeBuffer 是 short[] 数组) b
我们的应用程序需要知道它加载的音频文件的样本数。我们使用的库可以可靠地确定采样率,但不能确定样本数。我们是否可以仅从文件大小和采样率来计算样本数? 最佳答案 马克说什么。不,通常您需要解释标题。但是,
我正在用java做一个项目,需要我加密wave文件。那么,是否有一个直接的过程可以将波形文件转换为二进制文件并返回?我将对二进制数据应用加密算法。 最佳答案 是的。 File file = new F
我想知道如何从 .wav 文件中获取样本以执行两个 .wav 文件的窗口连接。 谁能告诉我怎么做? 最佳答案 wave标准库的模块是关键:当然在代码顶部的 import wave 之后,wave.op
我有一个几分钟长的 .wav 文件,我想将其分成不同的 10 秒 .wav 文件。 到目前为止,这是我的 python 代码: import wave import math def main(fil
我在 ffmpeg 中使用以下命令合并多个 wav 文件: -f concat -safe 0 -i /storage/emulated/0/AudioClipsForSpeakerRecogniti
我正在尝试用python实现主动降噪。我的项目由两组代码组成: 录音代码 声音过滤代码 我的目标是当您运行该程序时,它将开始通过麦克风录音。录音完成后,会生成一个名为“file1.wav”的保存文件,
我正在尝试制作一个音乐识别系统。我担心我可能没有按照预期读取 wav 样本,而且我可能会应用错误的窗口大小来进行 FFT 和其他操作。 如果你能帮我的话,那就太好了。 首先,我有一些关于 Wavs 中
如何使用 java 合并两个 wav 文件? 我试过了 this但它没有正常工作,他们还有其他方法吗? 最佳答案 如果您直接处理 wav 文件的字节,您可以在任何编程语言中使用相同的策略。对于此示例,
尝试为我的 previous question 找到解决方法,我想将用 byte[](具有 wav header )编写的 16k 8 位单声道 wav 转换为 8k 8 位单声道流/字节 []。 是
目前我正在使用一个语音到文本的翻译模型,该模型采用 .wav 文件并将音频中的可听语音转换为文本转录本。该模型之前曾用于直接录制的 .wav 音频录音。但是现在我正在尝试对视频中最初出现的音频做同样的
试图在 python 中将 wav 文件转换为 wav uLaw。 使用 pydub 的 AudioSegment,我可以使用以下命令转换为 mp3: AudioSegment.from_wav(fr
我在 xcode 项目中添加了 LibFlac。然后我在我的项目中添加了来自 Libflac 的decode/main.c。我通过了 infile.flac 并运行了项目的可执行文件,但它给出了以下错
大家好,感谢您的阅读。 我想使用 Python 的 scipy.io.wavfile 对一首歌进行一些分析。由于我只有 .mp3 格式的歌曲,因此我使用 ffmpeg 将文件转换为 .wav,方法如下
我需要连接两个音频波,以便最终输出的音频波应该有一个更平滑的交汇点。我的意思是,在连接点,假设 10 秒钟,第一个音频应该开始淡出,而另一个音频开始拾取。 我已经能够连接两个音频文件并生成单个输出,但
我需要将一个 wav 文件转换为 8000Hz 16 位单声道 Wav。我已经有一个代码,它适用于 NAudio 库,但我想使用 MemoryStream 而不是临时文件。 using System.
我是一名优秀的程序员,十分优秀!