2012-06-06 29 views
4

我是一名新的iOS開發人員,我正在爲視頻共享網站開發視頻播放器應用程序,有時錄製內容包含兩個視頻流(一個顯示演示者,另一個顯示他的屏幕錄製)。我試圖用AVFoundation播放第二個視頻,創建一個AVPlayer。有些視頻效果很好,但有些視頻效果不佳。經過很多調查,我發現它試圖將整個視頻緩衝到內存中。AVPlayer(和MPMoviePlayerController)試圖緩衝整個(流媒體)視頻,耗盡內存

我花了數小時搜索它,但找不到任何東西。

我創建了一個小項目來證明這一點: 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,並試圖流式傳輸那些:然後我沒有問題!它會緩衝整部電影,但不會耗盡內存。如果我從原始網站(我們的視頻共享網站)流式傳輸它,它只會耗盡內存。這些網址在github項目中。

我真的很期待任何提示可能會導致這種情況。

謝謝!

+0

正如蘋果指南所建議的,不要使用漸進式下載更大的文件,而是使用正確的HTTP流。 – Till

+0

Hi @Till!感謝您的評論!我不確定我是否理解,如果我應該更改應用程序以使用流媒體,或者服務器端不正常?我遇到的問題是:http://stream.videotorium.hu:1935/vtorium/_definst_/mp4:705/3705/3705_3571_content_hq.mp4/playlist.m3u8?sessionid = cp8dl757mvqukp0bsoflhd79s0_3705',如果我捲曲它,我收到一個m3u,其中包含另一個URL,如果我這樣做,我會得到一個包含數百個URL的m3u,如'media_1.ts?wowzasessionid = 530673462&sessionid = cp8dl757mvqukp0bsoflhd79s0_3705'。這是否意味着服務器端正在發送適當的流? – zsombornagy

回答

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(閃存)媒體服務器5.0上,這個問題不會發生。無論視頻是否包含音軌,只緩衝60秒。

希望有幫助。我已經要求Wowza人的輸入Wowza forums

+0

謝謝!我不知何故設法沒有注意到你的答案:(最後我去年放棄了這件事情,但今年我們會繼續發展,我將不得不解決這個問題,很高興知道這確實是缺乏音頻跟蹤,然後我們可以在服務器端解決你有沒有得到任何答案你的Wowza錯誤報告? – zsombornagy

+0

沒有反應 - 我沒有看到更多的自己,看看是否有新版本已經解決了這個問題 –

+0

好吧,謝謝,我可能會在接下來的幾個月裏更深入地研究這個問題,如果我發現任何問題,我會更新它。 – zsombornagy