2010-12-04 75 views
3

我正在解码一个在单独文件中有伴音轨的视频格式。根据规格,我每1/75秒渲染一帧视频。视频文件的长度与音轨的长度相同。将音频与音频队列服务同步的建议?

我正在使用Audio Queue Services播放音频(我之所以选择这个音频是因为我认为会出现需要精确定时控制的情况 - 只是我遇到的情况!)。这是一个很大的API,我没有在Apple的编程指南中通过示例代码取得很大进展(尽管我已经用更好的ObjC API封装了这些代码)。

在理想情况下,基本播放设置可以正常工作。视频和音频保持同步,并在同一时间结束(在我自己的能力区分)。但是,如果性能打嗝(或者我附上泄漏仪器或其他东西),它们很快就会失去同步。

这是我第一次写这种性质的东西:我以前没有声音或视频的经验。我当然没有使用音频队列服务的经验。所以我不确定该从哪里出发。

你做过这样的事吗?你有一些建议或提示或技巧提供?是否有一些我需要阅读的基础文档?任何帮助将不胜感激。

+0

你用什么来播放视频? – sbooth 2010-12-08 17:22:17

+0

我用CGBitmapContextCreate创建了一个CGContextRef,并将像素写入其数据流,并将其转化为CGImageRef以绘制到CALayer中。为了提高效率,我只更新每帧更改的像素。幸运的是,这是一种质量很低的视频格式。 – 2010-12-08 19:11:08

回答

2

首先,我从来没有真正编码过这样的东西,所以我从臀部拍摄。另外,我用HAL和AUHAL做了大量的编程,但从来没有用过AudioQueue,所以我的方法可能不是使用AQ的最佳方法。

显然,首先要决定是将音频同步到视频还是将视频同步到音频。从这个问题看,你已经决定视频将成为主,音频应该同步到它。

我会通过跟踪呈现的视频帧数以及帧频来解决这个问题。然后,在排队音频缓冲区时,不要为startTime传递单调递增的值,而是调整缓冲区的开始时间以匹配在视频中观察到的任何不连续点。这有点含糊,因为我不确切知道你的音频来自哪里,或者你是如何排队的,但希望原理很清楚。