2012-05-23 19 views
1

在我的應用程序中,我有一個AVPlayer用於播放,擦洗等視頻文件。我試圖實現以下功能,但還沒有拿出一個好的解決方案呢......使用AVPlayer在一個循環中向前播放一小段視頻

假設視頻文件是3000幀長,並且播放頭在幀1000上。當用戶按下「播放「按鈕,我希望視頻播放以幀1000爲中心的視頻的10幀部分,即995-1005幀。當播放器到達995或1005幀時,我希望播放的方向相反。換句話說,框架順序將變爲:

1000-1001-1002-1003-1004-1005-1004-1003-1002-1001-1000-999-998-997-996-995-996-997- 998-999-1000

並無限重複。

我第一次嘗試使用-addBoundaryTimeObserverForTimes:queue:usingBlock:來定義視頻部分的開始點和結束點,並在塊中切換播放器速率的符號。這有效地工作有時,但是當視頻部分很小時,最終其中一個邊界會被「漏掉」,視頻會繼續沿着那個方向繼續播放,直到它到達文件的開頭或結尾。

我試圖通過增加另一個時間觀察者–addPeriodicTimeObserverForInterval:queue:usingBlock:來緩解這個問題,它將檢查邊界是否被錯過並重置循環播放,如果是的話。再次,這工作有時,但如果播放區域的開始或結束也恰好是視頻文件的第一幀或最後一幀(分別),將會失敗。

I 然後試圖設置AVPlayerItemDidPlayToEndTimeNotification的回調,以便在回放到視頻文件的邊界時再次重置播放。再一次,這工作有時候但最終會停止播放或導致播放無限期地播放遠離文件結尾的方向。

我不知道該怎麼做。我可能會創建一個AVMutableComposition來模擬效果,但還有很多其他對象取決於視頻播放器的確切時間,因此需要對應用程序進行大修改,以便實現整個單獨的處理系統以模擬適當的視頻播放器的時間來自作曲(我在這一點上不願意做)。有任何想法嗎?

回答

1

我想我會做你的情況是去與你的第二個選項:

使用addPeriodicTimeObserverForInterval:隊列:usingBlock,但對緩解您所描述的問題,空白錄像一秒增加了前部和剪輯結束時(如果您正在控制剪輯資源) - 無論是在源處。

如果你不能這樣做,我認爲看AVMutableComposition可能是有意義的(在作品的前面和後面添加一個空的剪輯),並再次使用addPeriodicTimeObserverForInterval:queue:usingBlock,就像你指出的那樣。