【问题标题】:AVPlayer (and MPMoviePlayerController) tries to buffer the whole (streaming) video, runs out of memoryAVPlayer(和 MPMoviePlayerController)试图缓冲整个(流)视频,内存不足
【发布时间】:2012-06-10 04:00:59
【问题描述】:

我是一名新的 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 中,并尝试流式传输这些文件:那么我没有问题!它缓冲整部电影,但不会耗尽内存。如果我从原始站点(我们的视频共享站点)流式传输它们,它只会耗尽内存。网址在 github 项目中。

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

谢谢!

【问题讨论】:

  • 按照 Apple 指南的建议,不要对更大的文件使用渐进式下载,而是使用适当的 HTTP 流。
  • 嗨@Till!谢谢你的意见!我不确定我是否理解,如果我应该将应用程序更改为使用流媒体,或者服务器端不正常?我遇到问题的 URL 是:http://stream.videotorium.hu:1935/vtorium/_definst_/mp4:705/3705/3705_3571_content_hq.mp4/playlist.m3u8?sessionid=cp8dl757mvqukp0bsoflhd79s0_3705,如果我 curl 它,我会得到一个包含另一个 URL 的 m3u,如果我 curl 那个,我会得到一个包含数百个 URL 的 m3u,例如 media_1.ts?wowzasessionid=530673462&sessionid=cp8dl757mvqukp0bsoflhd79s0_3705。这是否意味着服务器端正在发送正确的流?

标签: ios video-streaming avfoundation avplayer buffering


【解决方案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 forums@

向 Wowza 的人们征求意见

【讨论】:

  • 谢谢!不知怎的没注意到你的回答 :( 去年我终于放弃了这个东西,但是今年我们会继续开发,我将不得不解决这个问题,很高兴知道这确实是关于缺乏音频跟踪,然后我们可以在服务器端解决。您的 Wowza 错误报告得到任何答复了吗?
  • 没有回应 - 我自己也没有深入研究,看看新版本是否解决了这个问题。
  • 好的,谢谢,我可能会在接下来的几个月内对此进行更多研究,如果有任何发现我会更新。
  • 我收到了 Apple 的答复:“我们认为出现此问题是因为内容创作不正确;您的视频仅在传输流段中,但已在您的节目映射表中声明应该使用音频出现在流中。您应该能够通过更改节目映射表来解决此问题,以仅指示视频存在。"
  • @Jonny 嗨!是的,我记得服务器团队改变了视频的编码方式,并解决了问题,但那是几年前的事了,遗憾的是我不记得细节了。
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2018-11-06
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多