我是一名新的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项目中。
我真的很期待任何可能导致这种情况的提示。
谢谢!
答案 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人员提供意见