如何在iPhone上的流式音频中实现搜索(时间线功能)?
AudioFileStreamSeek方法接受我想要开始搜索的字节偏移量。我希望能够获得正在播放的mp3的当前位置,并让用户稍后返回(寻找)到同一位置。
但我找不到任何方法知道已播放的字节数。我可以找出已经流式传输的字节数。但无法找出已播放的字节数。我使用Matt Gallagher的音频流示例作为基础。
非常感谢任何帮助。
感谢。
可能只是能够找到解决方案。 AudioFileStreamSeek文档说
调用此功能后, 解析器假定传递给下一个数据 AudioFileStreamParseBytes函数 从返回的字节偏移量开始 在outAbsoluteByteOffset中 参数。
我们怎么做?我们应该使用Http Range参数吗?如果我们将字节偏移量发送到Range,它是否会按预期工作?我应该如何清除缓冲区中的现有字节以避免两个流一起播放?
非常感谢任何帮助。谢谢。
答案 0 :(得分:2)
AudioFileStreamSeek使用数据包,而不是字节数。因此,您真正需要跟踪的是数据包计数。
Matt代码中的MyEnqueueBuffer方法是将缓冲区发送到AudioQueue进行播放的位置。抓包填充并在将packetfilled重置为0之前递增索引变量:
myData.absolutePackets = myData.absolutePackets + myData-> packetsFilled;
我的问题是即使使用此值,我也无法正确实现AudioFileStreamSeek。因此,如果您有一些使用Matt代码进行工作搜索的示例代码,请分享。
谢谢!
答案 1 :(得分:1)
我还没有真正尝试使用AudioFileStream API(我们在内部推出了自己的API),但这里有一些你必须要处理的事情。
假设您在随机搜索字节流方面没有问题,那么您必须继续跟踪MP3帧编号与绝对字节流位置之间的关系,就像Paul所说的那样。我假设你可以通过在整个过程中调用AudioFileStreamSeek在你的AudioFileStream_PacketsProc中做到这一点。
这是更棘手的部分。进行随机搜索时,必须重置AudioFileStream的内部状态。因为它可能处于某个中间状态,期望下一个输入字节完成当前帧。我不确定你是否可以只提供零来跳过当前帧,然后重新开始(你必须尝试,因为我在API中看不到类似AudioFileStreamReset的东西;但是,音频队列本身也是如此;有重置功能,你可以清理已经排队的帧)。无论如何,您还必须处理AudioFileStream_PacketsProc,因为您要解析已经跟踪过的字节流的一部分。
请注意,您不能仅依靠第二个和比特率来找到MP3帧的开头。即使使用非可变速率的MP3流,也可以每隔几帧就有一个填充。所以最准确的信息仍然来自解析器。
我应该快速补充说,另一种做随机搜索的方法就是“缓存”(存储)解析后的数据包,如果你没有播放真正长而大的流。帧索引可以从帧头信息计算。对于非VBR MP3,每秒帧数是一个常数(例如,对于44.1 kHz立体声非VBR MP3,它是44100/1152 = 38.28125帧/秒;请查看MP3规格,了解其原因)。
答案 2 :(得分:0)
所以只要停止播放....并从不同的采样时间开始? [只需占用当前的采样时间并根据需要进行操作?]
inDeviceStartTime 音频队列应该开始的时间。
要指定相对于关联音频设备的时间轴的开始时间,请使用AudioTimeStamp结构的mSampleTime字段。使用NULL表示音频队列应该尽快启动。
返回值 结果代码。请参阅“音频队列结果代码”。
讨论 如果关联的音频设备尚未运行,则此功能将启动它。