AVPlayer(和MPMoviePlayerController)尝试缓冲整个(流)视频,耗尽内存

时间:2012-06-06 06:22:39

标签: ios video-streaming avfoundation avplayer buffering

我是一名新的iOS开发人员,我正在为一个视频分享网站制作一个视频播放器应用程序,有时录制内容包含两个视频流(一个显示主持人,另一个显示他的屏幕录制) 。我正在尝试用AVFoundation播放第二个视频,创建一个AVPlayer。有些视频可以很好地运行,但是对于其他一些视频,它会耗尽内存。经过大量调查后,我发现它试图将整个视频缓冲到内存中。

我花了几个小时搜索它,但找不到任何东西。

我创建了一个小项目来证明这一点: github project。它为两个不同的视频流设置两个AVPlayer,并更新UI以显示玩家的AVPlayerItem的loadedTimeRanges。对于第一个视频,它只缓冲~60秒,这很好,但对于第二个视频,它保持缓冲。

self.player1 = [AVPlayer playerWithURL:url1];
self.player2 = [AVPlayer playerWithURL:url2];

和两个文字标签:

self.data1.text = [NSString stringWithFormat:@"Player 1 loadedTimeRanges: %@",
                      self.player1.currentItem.loadedTimeRanges];
self.data2.text = [NSString stringWithFormat:@"Player 2 loadedTimeRanges: %@",
                      self.player2.currentItem.loadedTimeRanges];

这可能很重要:过度缓冲的视频没有音轨,只有视频。

UPDATE :我使用MPMoviePlayerController而不是AVPlayer重现了问题,并检查了playableDuration属性。第一部电影停在60秒左右,第二部电影继续播放,然后内存耗尽。

UPDATE2 :我收到了实际的视频文件并将它们放到了Dropbox上,然后尝试传输这些文件:然后我没有问题!它缓冲整个电影,但它不会耗尽内存。如果我从原始站点(我们的视频共享站点)流式传输它,它只会耗尽内存。 URL存在于github项目中。

我真的很期待任何可能导致这种情况的提示。

谢谢!

1 个答案:

答案 0 :(得分:1)

这个问题确实是由于Wowza媒体服务器发送的视频流缺少音频轨道造成的。 (我从您的流网址中推断出您正在使用Wowza媒体服务器来传输视频)。

为验证此问题,我创建了一个没有音轨的5分钟视频文件。

mplayer -nolirc -vo null -ao null -frames 0 -identify test_60.mp4
...
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
ID_VIDEO_CODEC=ffh264
Audio: no sound
Starting playback...
...

然后我使用mp4box为该视频文件添加了一首mp3曲目。

MP4Box -new -add test_60.mp4 -add test_music.mp3 test_60_music.mp4

并确认确实存在音轨。

mplayer -nolirc -vo null -ao null -frames 0 -identify /tmp/test_60_music.mp4
...
AUDIO: 44100 Hz, 2 ch, floatle, 320.0 kbit/11.34% (ratio: 40000->352800)
ID_AUDIO_BITRATE=320000
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
Selected audio codec: [ffmp3float] afm: ffmpeg (FFmpeg MPEG layer-3 audio)
==========================================================================
AO: [null] 44100Hz 2ch floatle (4 bytes per sample)
ID_AUDIO_CODEC=ffmp3float
Starting playback...
...

然后,我将test_60.mp4和test_60_music.mp4放在Wowza内容目录中,并对其进行测试。我实际上写了一个类似于你的小测试应用程序来检查loadedTimeRanges,但只是从设备通过safari加载视频应该足以看出差异。

我打开wowza_server:1935 / vod / mp4:test_60.mp4 / playlist.m3u8并在开始播放时按下暂停。缓冲指示器持续增加,直到加载完整的5分钟视频。

然后,我打开了wowza_server:1935 / vod / mp4:test_60_music.mp4 / playlist.m3u8并做了同样的事情,但只加载了第一个1/5(大约1分钟)。

所以Wowza服务器的打包似乎是一个问题 - 注意在adobe(flash)媒体服务器5.0上我不会遇到这个问题。无论视频是否包含音轨,都只缓冲60秒。

希望这有帮助。我已经在Wowza forums

要求Wowza人员提供意见