ffmpeg時間有關的操作


1. 音頻和視頻的時長

  1-1. 使用 -t 參數設置時長,單位是秒

    比如:ffmpeg  -i  music.mp3  -t  180  music_3_minutes.mp3

  1-2. 設置幀的數量

    音頻選項audio:-aframes  number 或者 -frames:a  number 

    數據選項data:-dframes  numebr 或者 -frames:d  number

    視頻選項video:-vframes  number 或者 -frames:v  number

      比如:ffmpeg  -i  video.avi  -vframes  15000  video_10_minutes.avi

2. 延遲設置

  使用 -ss參數實現(ss即seek from start)。它的值可以是秒數或者HH:MM:SS格式的時間

    比如視頻延遲10秒的處理:ffmpeg -i input.avi -ss 10 output.mp4

3. 從媒體文件提取指定的部分

  結合-ss參數和-t參數,可以實現提取文件的指定部分。

    比如提取文件的第五秒:ffmpeg -i video.mpg -ss 240 -t 60 clip_5th_minute.mpg  //-ss 240表示延遲4分鍾開始, -t 60表示提取60秒

  3-1. 多個輸入流之間的延遲處理

    如果希望某個輸入流延遲輸出,可以使用 itsoffset(input timestamp offset) 參數和 -map參數 實現。

    注意:一些格式比如AVI, FLV, MOV, MP4等等由於頭部的不同導致有些時候 itsoffset 參數不起作用。

    下面例子是讓 音頻延遲1秒,然后和視頻合並,如下:

      ffmpeg -i input.avi -ss 1 audio.mp3
      ffmpeg -i input.avi -i audio.mp3 -map 0:v -map 1:a video.mp4 

  3-2. 一個文件的多條媒體流的延遲處理

    比如一個文件有音頻流和視頻流但是它們不同步,假設音頻快5秒,則同步處理如下:

      ffmpeg -i input.mov -map 0:v -map 0:a -itsoffset 5 -c:a copy -c:v copy output.mov  //-map 0:v表示第一個輸入的視頻流,不做處理。-map 0:a -itsoffset 5表示第一個輸入的音頻流,延遲5秒開始

    比如是視頻流快5秒,則同步處理如下:

      ffmpeg -i input.mov -map 0:v -itsoffset 5 -map 0:a -c:a copy -c:v copy output.mov

  3-3. 多個文件的延遲處理

    比如有兩個文件作為輸入,一個音頻文件,一個視頻文件,要讓音頻延遲3秒開始,則處理如下:

      ffmpeg -i v.mpg -itsoffset 3 -i a.mp3 -map 0:v:0 -map 1:a:0 output.mp4  //-map 0:v:0表示第一個輸入的所有視頻流的第一條視頻流,-map 1:a:0表示第二個輸入的所有音頻流的第一條音頻流

  3-4. 限制處理時長

    使用 -timelimit參數限制處理的時長,值為秒數。

    比如說編碼10分鍾后就退出,如下:

      ffmpeg -i input.mpg -timelimit 600 output.mkv  //600表示秒數,即10分鍾

  3-5. 最短的那條流決定了編碼時長

    默認情況下,編解碼處理是處理完所有媒體流才會結束的,也就是最長的那條流決定處理的時長。可以使用 -shortest參數指定最短的那條流決定處理時長。

    比如要合並video.avi 和 audio.mp3,音頻audio.mp3時長比視頻video的短,現在要處理完音頻即退出,如下:

      ffmpeg -i video.avi -i audio.mp3 -shortest output.mp4  //添加-shortest參數

4. 時間戳和時間基線

  設置時間戳,使用 -timestamp參數。它的值形式如下:

    1)now  //當前時間

    2)YYYY-MM-DD 或者 YYYYMMDD 格式的日期,不指定則當前日期

    3)HH:MM:SS[.m...] 或者 HHMMSS[.m...] 格式的時間,不指定則當前時間

    4)在日期和時間之間可以添加T和t字母,也可以不添加

    5)如果最后以Z或者z結束的表示UTC時間,否則是本地時間

    比如下面是時間戳是有效的:2010-12-24T12:00:00, 20101224t120000z, 20101224120000

    又比如,ffmpeg獲取視頻流的信息如下:

      Stream #0:0, 1, 1/25: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46),yuv420p, 320x240 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn, 25 tbc

      tbr、tbn、tbc的介紹如下:

        

        tbc是用於給定流的AVCodecContext里的編解碼基線。thn用於所有的AVStream里的基線。tbr是猜測的基線,和幀率的值一樣。

5. 編碼時間基線的設置

  進行流copy時,給編碼器指定時間基線,使用 -copytb參數實現,它有3個可選值:1(解封裝器demuxer 的時間基線),0(解碼器decoder的時間基線),-1(自動選擇,這是默認值)

  比如給輸出指定編碼時間基線為 解封裝器的時間基線,如下:

    ffmpeg -i input.mp4 -copytb 1 output.webm

6. 修改音頻和視頻的播放速度

  6-1. 改變視頻速度

    使用 setpts 濾鏡實現。setpts即(set presentation timestamp),setpts的介紹如下:

      

      每一個視頻幀都有一個帶有時間戳的頭部,兩個連續的幀之間的時差是1/fps。比如幀率fps為25,則時差為1/25=0.04秒,這個值就是PTS。如果想改變播放速度,就是改變PTS的值了。

      比如播放速度加快3倍,修改如下:

        ffplay -i input.mpg -vf setpts=PTS/3

      比如播放速度是原本的3/4,修改如下:

        ffplay -i input.mpg -vf setpts=PTS/(3/4)

  6-2. 改變音頻速度  

    使用 atempo 濾鏡實現。 atempo 濾鏡的介紹如下:

      

      tempo的取值范圍為 0.5 ~ 2.0 ,小於1.0表示減速,大於1.0表示加速,默認是1.0

      比如要讓音頻加速2倍,如下:

        ffplay -i speech.mp3 -af atempo=2

      比如要讓音頻減速一半:

        ffplay -i speech.mp3 -af atempo=0.5

  6-3. 通過時間戳去同步音頻數據

    使用asyncts濾鏡實現。asyncts的介紹如下:

      

      比如要同步music.mpg的數據,如下:

        ffmpeg -i music.mpg -af asyncts=compensate=1 -f mpegts music.ts  //compensate=1表示開啟數據伸縮用以匹配時間戳。如果不開啟的話,需要拉伸的地方使用靜音填充

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM