2011-05-19 36 views
3

我想同時在多個視圖上呈現多個H264 mp4視頻。目標是閱讀約8個短視頻,每個視頻大小爲100x100像素,並讓他們同時在屏幕上的多個位置顯示其內容。iOS視頻:可以同時使用4個以上AVAssetReader?

想象一下屏幕上的24個方塊,每個顯示8個視頻池中的一個視頻。

MoviePlayer不起作用,因爲它只顯示一個全屏視頻。具有多個AVPlayerLayers的AVPlayer是有限的,因爲只有最近創建的圖層將在屏幕(根據文檔和我的測試)上顯示它的內容。

因此,我寫了一個簡短的視頻類,併爲我的包中的每個.mp4文件創建了一個實例,使用AVAssetReader讀取它的內容。在更新時,根據視頻的幀率,每個視頻幀都會被轉換爲UIImage並顯示。此外,這些圖像被緩存以便在循環中快速訪問。

- (id) initWithAsset:(AVURLAsset*)asset withTrack:(AVAssetTrack*)track 
{ 
    self = [super init]; 
    if (self) 
    { 
     NSDictionary* settings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], (NSString*)kCVPixelBufferPixelFormatTypeKey, nil]; 

     mOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:track outputSettings:settings]; 
     mReader = [[AVAssetReader alloc] initWithAsset:asset error:nil]; 

     [mReader addOutput:mOutput]; 

     BOOL status = [mReader startReading]; 
    } 

    return self; 
} 


- (void) update:(double)elapsed 
{ 
    CMSampleBufferRef buffer = [mOutput copyNextSampleBuffer]; 

    if (buffer) 
    { 
    UIImage* image = [self imageFromSampleBuffer:sampleBuffer]; 
    } 

    [...] 
} 

其實這個作品相當不錯,但只適用於4個視頻。第五個從不出現。首先,我想到了記憶的問題,但我測試了以下設備:

  • iPhone 3GS
  • iPhone 4
  • iPad的
  • iPad 2的

我上有相同的行爲每個設備:4個視頻以平穩循環播放,沒有差異。

如果這將是一個內存問題,我會期望至少iPad 2顯示5或6個視頻(由於它是更好的硬件),或3GS只顯示1或崩潰的地方。

雖然模擬器顯示所有視頻。

在裝置顯示調試,即

BOOL status = [mReader startReading]; 

返回false用於視頻5,6,7和8

因此,有某種硬件設置(或限制),其沒有按」允許4個以上的AVAssetReaders?因爲,我無法真正解釋這種行爲。我不認爲所有設備都具有完全相同數量的視頻內存。

+0

它更可能比顯存H.264解碼芯片的限制。 – 2011-05-30 02:22:39

+0

你解決了這個問題嗎?我正在經歷同樣的行爲 – 2011-11-07 01:42:12

回答

0

您是否嘗試過爲每個AVPlayerLayer基於相同的AVAsset創建單獨的AVPlayerItems?

2

是的,iOS對於一次可以解碼的視頻數量有上限。雖然你的方法是好的,但我不知道有什麼方法可以解決這個上限,只要有很多h.264解碼器同時激活即可。如果您有興趣,請查看我對這個問題的解決方案,這是一個名爲Fireworks的xcode項目。基本上,這個演示展示了將一組alpha通道視頻解碼到磁盤,然後通過將一部分視頻文件映射到內存來播放每個視頻。這種方法可以同時解碼超過4部電影,而無需使用所有的系統存儲器,也不會遇到h.264解碼器對象數量的硬限制。

相關問題