日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

FFmpeg command line tool(Android中使用FFmpeg命令行)

發(fā)布時間:2025/6/15 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FFmpeg command line tool(Android中使用FFmpeg命令行) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 官網(wǎng)地址:ffmpeg.org/
  • Android端,不想編譯,可以直接使用ffmpeg-android-java

關(guān)于轉(zhuǎn)碼:

網(wǎng)絡(luò)限制了視頻傳輸?shù)膸挕S捎趲捪拗?#xff0c;這就要求我們在傳輸之前通過實(shí)時視頻轉(zhuǎn)碼將視頻數(shù)據(jù)轉(zhuǎn)換成帶寬效率更高的格式。轉(zhuǎn)碼的意義在于可以在視頻質(zhì)量幾乎不損失的前提下節(jié)省大量的網(wǎng)絡(luò)帶寬。FFmpeg主要就是做轉(zhuǎn)碼這件事情。

FFmpeg轉(zhuǎn)碼流程示意圖:

_______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |_______| |______________| |v_________| || decoded || frames ||_________|________ ______________ | | | | | | | output | <-------- | encoded data | <----+ | file | muxer | packets | encoder |________| |______________| 復(fù)制代碼

基本命令解釋:

  • -y => 覆蓋輸出

  • -i => 輸入源頭,比如一個視頻的絕對路徑:/sdcard/....,輸出我們也是寫絕對路徑

  • -f => 輸出格式,如果省略就取輸出錄制的后綴名為輸出格式,比如輸入mp4格式:-y -i input -f mp4 output

  • -c:v => 針對視頻流的編碼 ,等介于-vcodec

  • -c:a => 針對音頻流的編碼,等介于-acodec

  • -c:v h264 => 指定視頻流h264編碼方式,有時候也寫成libx264,FFmpeg也可以識別

  • -c:a aac => 指定音頻流aac編碼方式

  • copy => 不編碼,如-c:v copy就是對視頻流不編碼,注意:如果加了不必要的編碼操作,會影響執(zhí)行效率。

  • -an => 禁用音頻

  • -vn => 禁用視頻

  • -x264-params keyint=10 => 為視頻設(shè)置關(guān)鍵幀,每隔10幀生成一個關(guān)鍵幀

  • -crf => 動態(tài)碼率,壓縮效果佳,不是一味追求體積,畫質(zhì)佳,H.264的CRF數(shù)字范圍在0~51,23是默認(rèn)值。

  • -b:v => 靜態(tài)碼率,壓縮效率比較爆炸,一味控制體積

  • -filter_complex => 濾鏡,簡單濾鏡是-vf,常用的有變速濾鏡,水印濾鏡等

  • -map => 可以理解為流的過濾器:

    • -map[0:v] 就是選擇第一輸入源的視頻流,流向輸出。
    • -map[1:a] 就是選擇第二輸入源的音頻流,流向輸出。
  • -max_muxing_queue_size=>如果視頻比較大,需要指定這個值比較大(比如9999),否則程序執(zhí)行會中斷。

  • -fps 幀率

  • -vframes 幀數(shù)

  • -r幀率

  • -preset

    • preset和crd參數(shù)一樣,會影響壓縮效果,preset可以很大程度影響程序的執(zhí)行速度,每條命令都可以加,一般加載命令尾部,output之前:
    preset描述
    ultrafast編碼速度最快 ,壓縮效果最差
    superfast···
    veryfast···
    faster···
    fast···
    medium– default preset
    slow···
    slower···
    veryslow編碼速度最慢 ,壓縮效果從最好
  • h264編碼相關(guān),涉及CRF,Preset等,Encode/H.264

合并多個視頻

  • 使用concat協(xié)議:把視頻轉(zhuǎn)成ts流,contact合并多個ts生成視頻:

    • ts流涉及到一個參數(shù):h264_mp4toannexb
    mp4-->ts: remux an MP4 file containing an H.264 stream to mpegts format with ffmpeg, you can use the command:ffmpeg -i INPUT.mp4 -codec copy -bsf:v h264_mp4toannexb OUTPUT.ts多個ts合并:ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output 復(fù)制代碼

    Concat protocol

視頻音頻流變速

  • How to speed up / slow down a video 視頻速度變成原來的兩倍:
    ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv 音頻速度變成原來的兩倍: ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv 如果是音頻和視頻一致加速兩杯: 這里會涉及到濾鏡的概念和-map指令的使用,輸入有多個流,我們就可能用到-map指定: 假設(shè)有音頻流和視頻流:
speed是目標(biāo)速率,比如2. -y -i input -filter_complex [0:v]setpts=" + 1d/speed + "*PTS[v];[0:a]atempo=" + speed + "[a] output 復(fù)制代碼

如果只有視頻流:

-y -i input -vf [0:v]setpts=" + 1d/speed + "*PTS" output 復(fù)制代碼

裁剪時長

  • -ss 裁剪開始時間,單位秒
  • -t 需要裁剪多長時間,單位秒 從第一秒,裁剪3秒視頻生成新視頻 -y -i input.mp4 -s 1 -t 3 ouput.mp4

生成縮率圖

  • 這里涉及兩個指令-vframes ,-fps;
    • -vframes是幀數(shù)
    • -fps是幀率,(frames per second),時間(秒)fps=vframs -生成某個時刻的縮率圖: ffmpeg -i input.flv -ss 00:00:14.435 -vframes 1 out.png 每秒生成一張圖片,命名為thumb1.png,thumb2.png,thumb3.png.....(輸出是絕對路徑) ffmpeg -i input -vf fps=1 thumb%d.png 每秒生成兩張圖片,命名為thumb001.png,thumb002.png,thumb003.png,-s指令來指定分辨率100100..... ffmpeg -i input -s 100X100 -vf fps=2 thumb%3d.png

圖片生成幻燈片(多圖合成視頻)

  • 如何輸出的圖片是規(guī)則的,img001png,img002.pmg,img003.pn... 我生成每秒10幀的幻燈片,默認(rèn)是25幀每秒: ffmpeg -framerate 10 -i img%03d.png output.mp4 注意:如果生成是h264的視頻,加上 -vf format=yuv420p 或者 -pix_fmt yuv420p可以防止某些播放器無法解碼視頻。 生成幻燈片相關(guān)
  • 如果文件名是不規(guī)則,也可以使用concat協(xié)議:
    • 先生成一個text文件,寫上對應(yīng)的file和duration(時長):duration 5 file '/path/to/cat.png' duration 1 file '/path/to/rat.png' duration 3 file '/path/to/tapeworm.png' duration 2 file '/path/to/tapeworm.png' 復(fù)制代碼
    • ffmpeg -f concat -i input.txt -vsync vfr -pix_fmt yuv420p output.mp4

更改分辨率

  • ffmpeg -i input -s width*height -c:v h264 output

從視頻中裁剪一塊區(qū)域出來

在起點(diǎn)(x,y)的地方裁剪下長高為wh的區(qū)域?qū)?yīng)的視頻(坐標(biāo)系:以視頻左上角為原點(diǎn),向右為正方向,向下為正方向) ffmpeg -i -vf crop=w:h:x:y output crop指令

水印

  • 疊加一張靜態(tài)圖,overlay是picture左上角對應(yīng)的坐標(biāo),(坐標(biāo)系:以視頻左上角為原點(diǎn),向右為正方向,向下為正方向): ffmpeg -i input -i picture -filter_complex overlay=0:0 output
  • 疊加GIF,如果想要GIF無限循環(huán),使用這條指令(否則可以用上面的指令): ffmpeg -i input -ignore_loop 0 -i gif -filter_complex overlay=shortest=1 如果需要加坐標(biāo): ffmpeg -i input -ignore_loop 0 -i gif -filter_complex overlay=x:y:shortest=1

GIF

從視頻前兩秒片段中抽出一張幀率是10的GIF ffmpeg -i INPUT -ss 0 -t 2 -r 10 out.gif 上門的指令生成的GIF是比較模糊的,如果要生成高清的GIF: 先生成調(diào)色板,再利用調(diào)色板生成GIF,假設(shè)fps=10, ffmpeg -i INPUT -r 10 -vf fps=10,scale=300:-1:flags=lanczos,palettegen colorPalette.png scale是縮放的意思,這里是設(shè)置寬為300,-1是保持寬高比. ffmpeg -i input -i colorPalette.png -r 10 -lavfi fps=10,scale=300:-1:flags=lanczos[x];[x][1:v]paletteuse 得到清晰GIF相關(guān)

Android 使用:

  • 生成一個Shell命令數(shù)組,丟給FFmpeg可執(zhí)行文件處理即可 tips:文檔上的命令都是用空格隔開,其實(shí)把他理解成數(shù)組就好,重點(diǎn)是數(shù)組內(nèi)的元素不要錯即可;

    String ffmpegSplitWord = "如果是空格容易出錯,盡量是一個不容易和其他命令出突的字符(盡量和文件名不沖突)";StringBuilder sb = new StringBuilder("-y");sb.append(ffmpegSplitWord + "-i");sb.append(ffmpegSplitWord + input.toString());sb.append(ffmpegSplitWord + "-c:v");sb.append(ffmpegSplitWord + "libx264");sb.append(ffmpegSplitWord + "-x264-params");sb.append(ffmpegSplitWord + "keyint=" + Constant.Camerasettings.keyint);setBitRate(ffmpegSplitWord, sb);setPreset(ffmpegSplitWord, sb);sb.append(ffmpegSplitWord + output.toString());String ffmpeg_s = sb.toString();String[] command=ffmpeg_s.split(ffmpegSplitWord);try {FFmpeg.getInstance(IApplication.getInstance()).execute(command, new ExecuteBinaryResponseHandler() {@Overridepublic void onFailure(String s) {}@Overridepublic void onSuccess(String s) {}@Overridepublic void onProgress(String s) {}@Overridepublic void onStart() {}@Overridepublic void onFinish() {}});} catch (FFmpegCommandAlreadyRunningException e) {} 復(fù)制代碼

如何獲取處理進(jìn)度:

  • FFmpeg在處理的過程會打印出一些信息,比如 frame= 1 fps=0.0 q=0.0 size= 0kB time=00:01:02.71 bitrate= 0.0kbits/s speed=2.88x 我們可以拿到time信息,這是處理到哪個時間點(diǎn)的信息,把他專程秒,處理視頻時長,就可以得到處理進(jìn)度。

總結(jié)

以上是生活随笔為你收集整理的FFmpeg command line tool(Android中使用FFmpeg命令行)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。