4

我是一名新的 iOS 开发人员,我正在为视频共享网站开发视频播放器应用程序,有时录制由两个视频流组成(一个显示演示者,另一个显示他的屏幕录制)。我正在尝试使用 AVFoundation 播放第二个视频,创建一个 AVPlayer。有些视频效果很好,但有些视频内存不足。经过大量调查后,我发现它试图将整个视频缓冲到内存中。

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

我创建了一个小项目来证明这一点: github project。它为两个不同的视频流设置了两个 AVPlayer,并更新了 UI 以显示播放器的 AVPlayerItem 的加载时间范围。对于第一个视频,它只缓冲约 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];

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

更新:我重现了使用 MPMoviePlayerController 而不是 AVPlayer 的问题,并检查了 playableDuration 属性。第一部电影停止大约 60 秒,第二部电影继续播放,然后内存不足。

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

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

谢谢!

4

1 回答 1

1

这个问题确实是由于从 Wowza 媒体服务器发送的视频流缺少音轨造成的。(我从您的流 URL 中推断出您正在使用 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 论坛上征求过 Wowza 人的意见

于 2012-10-18T20:12:45.490 回答