感谢所有花时间阅读问题的人!
所以我使用MultipeerConnectivity制作了一个流.我能够将音频录制到CMSampleBuffer并将该缓冲区转换为UInt8数据.然后使用以下方法将该数据发送给对等方:
outputStream!.write(u8ptr, maxLength: Int(buffer.mDataByteSize))
Run Code Online (Sandbox Code Playgroud)
然后,当数据显示在inputStream上时,将调用以下方法:
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
Run Code Online (Sandbox Code Playgroud)
我有打印语句,所以这部分运行正常.当数据实际显示时,我调用我的函数
func readFromStream() {
Run Code Online (Sandbox Code Playgroud)
我知道我需要调用inputStream.read方法来实际读取流,但我不确定如何实际读取数据,然后将其转换为NSData,以便可以使用AVAudioPlayer播放.
(除非你意识到更好,更有效的方式)
这是我到目前为止所做的,但我没有测试它,我认为会有问题.
func readFromStream() {
var buffer = [UInt8](repeating: 0, count: 1024)
while (inputStream!.hasBytesAvailable) {
let length = inputStream!.read(&buffer, maxLength: buffer.count)
if (length > 0) {
if (audioEngine!.isRunning) {
audioEngine!.stop()
audioEngine!.reset()
}
print("\(#file) > \(#function) > \(length) bytes read")
let audioBuffer = bytesToAudioBuffer(buffer)
let mainMixer = audioEngine!.mainMixerNode
audioEngine!.connect(audioPlayer!, to: mainMixer, format: audioBuffer.format)
audioPlayer!.scheduleBuffer(audioBuffer, completionHandler: nil)
do {
try audioEngine!.start()
}
catch …
Run Code Online (Sandbox Code Playgroud) 我已经搜索过这个错误,但没有发现任何人有同样的错误。我很确定我知道这个错误意味着什么,但我不知道如何避免它。
基本上发生的事情是我通过 MultipeerConnectivity 拨打电话。我正在使用 AVAudioEngine 来录制音频并播放来自对等方的音频。
我注意到用户说话的时间和其他设备播放该音频所需的时间之间存在相当大的延迟,但我通过移除水龙头并重新安装它解决了这个问题。这完全消除了任何延迟。但是,有时它会引发错误。
我还允许用户将麦克风静音,当他们单击“静音”时,水龙头就会被移除。一旦他们点击取消静音,水龙头就会重新安装。有时这也会引发同样的错误:
AVAudioEngineGraph.mm:2707:InputAvailable: 所需条件为 false: NULL != tap
不过,这个错误似乎完全是随机的。有时会发生,有时则不会。我无法始终如一地重现该错误。
我的猜测是,这是因为它试图在已经存在水龙头的地方安装水龙头,但我不知道如何避免它。我想我可以增加安装水龙头的总线,但这似乎不是最好的选择。
我还查看了 AVAudioInputNode 上是否有一个属性可以告诉我特定总线上是否已经安装了水龙头,但我似乎没有找到任何属性。
有人对这个问题有经验吗?
我从云端导入文件时遇到问题。我正在处理一个我实际上没有创建的自定义文件类型。所以我不知道实际的扩展类型是什么(例如 com.example.pdf)。文件以 .toc 结尾,那么有没有办法我只能接受以 .toc 结尾的文件?
例如这样的事情:
UIDocumentPickerViewController(documentTypes: [String("*.toc")], in: .import)
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的,有没有办法允许选择任何文件?从那里我可以只检查最后 4 位数字并让用户知道文件必须以 .toc 结尾?
为了尝试获取有关文件类型的更多信息,我还在终端中运行了以下命令:
file -I filename.toc
Run Code Online (Sandbox Code Playgroud)
返回:
filename.toc: text/html; charset=us-ascii
Run Code Online (Sandbox Code Playgroud)
因为这表示它是一个“text/html”文件,我尝试使用:
UIDocumentPickerViewController(documentTypes: [String(kUTTypeText)], in: .import)
Run Code Online (Sandbox Code Playgroud)
但是,这不允许我选择文件...有人有什么想法吗?
我知道这个问题可能会得到一个糟糕的评级,但我一直在研究如何将音频输出重新路由到iOS设备上的扬声器的问题.
我看到用户的每个问题都谈到了使用你AVAudioSession
重新路由它.但是,我没有使用AVAudioSession
,我正在使用AVAudioEngine
.
所以基本上我的问题是,即使我正在使用AVAudioEngine
,我还应该有AVAudioSession
吗?
如果是这样,这两个对象之间的关系是什么?或者有没有办法连接AVAudioEngine
到AVAudioSession
?
如果不是这种情况,并且a AVAudioEngine
和a 之间没有任何关系AVAudioSession
,那么如何重新路由音频以使其在iOS设备而不是耳机上播放主扬声器.
谢谢!