English 中文(简体)
iPhone-在流媒体音频中寻找
原标题:
  • 时间:2009-03-16 10:57:18
  •  标签:

我该如何在iPhone上实现流式音频的查找(时间线功能)?

AudioFileStreamSeek方法接受我想从哪个字节偏移开始寻找。我想能够获取正在播放的mp3的当前位置,并让用户在以后的某个时间回到相同的位置(seek)。

但我找不到任何方法知道已播放的字节数。我可以找到已流传的字节数。但无法找出已播放的字节数。我正在使用Matt Gallagher的音频流示例作为基础。

非常感激您的帮助。

谢谢。

Might just be able to find a solution. AudioFileStreamSeek documentation says

After you call this function, the parser assumes the next data passed to the AudioFileStreamParseBytes function starts from the byte offset returned in the outAbsoluteByteOffset parameter.

How do we do that? Should we be using the Http Range parameter? If we send the byte offset to Range, will it work as expected? And how should I clear the existing bytes in the buffer to avoid two streams to play together?

Any help greatly appreciated. 谢谢。

最佳回答

AudioFileStreamSeek 使用的是数据包,而不是字节数。因此,您真正需要跟踪的是数据包数量。

在Matt的代码中,MyEnqueueBuffer方法是将缓冲区发送到AudioQueue以进行播放的地方。抓取已填充的数据包并在将PacketsFilled重置为0之前增加索引变量:

我的数据.绝对数据包数 = 我的数据.绝对数据包数 + myData->填包数;

我的问题是,即使有这个值,我也无法正确地实现AudioFileStreamSeek。因此,如果您有使用Matt的代码实现有效寻址的示例代码,请分享。

谢谢!

问题回答

我并没有真正尝试过AudioFileStream API(我们在内部使用自己的),但以下是你需要注意的几点。

假设你在随机查找字节流时没有问题,那么你需要像Paul说的那样跟踪MP3框架编号和绝对字节流位置之间的关系。我假设你可以通过在调用AudioFileStreamSeek的同时在AudioFileStream_PacketsProc中完成这一点。

这里是比较棘手的部分。当您进行随机查找时,必须重置AudioFileStream的内部状态。因为它可能处于某个中间状态,期望下一个传入的字节来完成当前帧。我不确定您是否只要提供零就可以跳过当前帧并重新开始(您必须尝试,因为我在API中没有看到类似于AudioFileStreamReset的内容;但是,音频队列本身确实具有重置函数,可以清理已排队的帧)。无论如何,您还必须注意您的AudioFileStream_PacketsProc,因为您将解析已经跟踪的字节流的一部分。

请注意,您不能仅仅依靠第二个和比特率来找到MP3帧的开始。即使是非可变比特率的MP3流,在每几个帧之间仍可能有填充。因此,最准确的信息仍来自解析器。

我应该迅速补充一点,另一种实现随机查找的方法是简单地“缓存”(存储)已解析的数据包,如果你不是播放真正长而大的流。帧索引可以从帧头信息中计算出来。对于非可变比特率的MP3,每秒的帧数是恒定的(例如,对于44.1 kHz立体声非可变比特率的MP3,它是44100/1152=38.28125帧每秒;请查看MP3规范了解原因)。

can you use AudioQueueStart with the mSampletime of the place you want to seek to?

so just stop the play.... and start at a different sample time? [just take the current sample time and manipulate it by what you need to?]

inDeviceStartTime The time at which the audio queue should start.

要指定相对于相关音频设备时间线的开始时间,请使用AudioTimeStamp结构的mSampleTime字段。使用NULL表示音频队列应尽快启动。

Return Value A result code. See “Audio Queue Result Codes.”

Discussion If the associated audio device is not already running, this function starts it.





相关问题
热门标签