十、FFmpeg視頻播放之快進快退

1、處理快進快退(seek)命令

本章我將給大家講解怎麼給我們的播放器添加快進、快退、定位功能,這也是幾乎所有播放器都有的功能。爲實現此功能,我們要用到av_seek_frame函數,這個函數非常簡單易用。

我們用鍵盤上的左右鍵分別表示向前和向後跳轉一小段,類似的用向上和向下鍵表示跳轉一大段。 這裏的一小段是10 秒,一大段是60 秒。爲此要在主循環監聽鍵盤事件。但是在捕捉到鍵盤事件後不能直接調用av_seek_frame函數,我們要在主要的解碼循環,decode_thread循環中處理這些事件。所以我們還要給大結構體添加一些變量,用來表示跳轉位置和跳轉標誌:

int             seek_req; // 跳轉標誌
int             seek_flags; // 跳轉方向,向前還是向後
int64_t         seek_pos; // 跳轉到哪個位置,即哪個時間點

在主循環中監聽按鍵事件,收按鍵事件後,先判斷是否有SDL_KEYDOWN事件,在收到這個事件後,再用event.key.keysym.sym來判斷是哪個按鍵被按下。在知道要往哪個方向跳轉、跳轉多長時間後,就把這個跳轉長度加到get_master_clock函數的返回值上。然後調用stream_seek函數設置seek_pos等變量。我們把新的時間轉換成爲avcodec的內部時間戳單位,注意視音頻流中的時間戳是以幀爲單位的,而不是用秒來計算。所以在調用stream_seek的時候,需要把時間戳轉換成秒,再傳遞給這個函數。調用av_rescale_q函數進行轉換,轉換公式爲seconds = frames * time_base(fps)。(avcodec默認的值爲1,000,000fps,所以2秒的內部時間戳爲2,000,000)。

int main(int argc, char *argv[]) {
// ...
  for(;;) {
    double incr, pos;
    SDL_W
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章