2011-08-27 88 views
16

我已经成功地将一帧电影的视频轨道逐帧加载到AVFoundation的OpenGL纹理中。我也跟着在这里的答案中描述的步骤:iOS4: how do I use video file as an OpenGL texture? 并采取了一些代码从WWDC2010的GLVideoFrame样品可以在这里下载:http://bit.ly/cEf0rMAVFoundation:视频到OpenGL纹理工作 - 如何播放和同步音频?

如何播放音频轨的电影同步到视频。我认为在单独的播放器中播放它不是一个好主意,但要使用相同的AVAsset的音轨。

AVAssetTrack* audioTrack = [[asset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]; 

我检索videoframe并通过

CMSampleBufferRef sampleBuffer = [self.readerOutput copyNextSampleBuffer]; 
CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 

的时间戳在CADisplayLink回调,其中readerOutput类型为AVAssetReaderTrackOutput*

如何获得相应的音频样本的? 以及如何发挥他们?


编辑:

我四处张望了一下,我认为,最好是使用这里介绍的方法使用AudioQueue从AudioToolbox.framework:AVAssetReader and Audio Queue streaming problem

还有一个AVFoundation中的音频播放器:AVAudioPlayer。但我不知道我应该如何将数据传递给initWithData - 初始化程序,它需要NSData。此外,我不认为这是我的情况的最佳选择,因为我知道每个新音频样本都需要创建一个新的AVAudioPlayer - 实例。

其他建议? 播放从AVAssetReaderTrackOutput得到的原始音频样本的最佳方式是什么?

+0

你有没有得到过这个地方? – RyanSullivan

+0

我的解决方案是用AVAssetReader打开电影来抓取OpenGL的帧,同时用AVAudioPlayer再次打开同一个电影文件,并让它们同时启动。这不是一个好的解决方案,但音频和视频非常同步。从那时起,我没有时间去寻找更好的解决方案。 – j00hi

+0

我也在使用AVAudioPlayer,但音频同步不是很好。有一个真正的解决方案会更好。 –

回答