前言#
FFmpeg一般使用官方打包好的命令行程序, 也可以使用源碼集成到自己的程序中,這種方式要求更高.這篇文章主要收錄命令行下的使用方法
使用方式#
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
ffmpeg -i [輸入文件名] [參數(shù)選項(xiàng)] -f [格式] [輸出文件]
參數(shù)選項(xiàng):#
先總結(jié)一下經(jīng)常使用的參數(shù)
-an: 去掉音頻
-vn: 去掉視頻
-acodec: 設(shè)定音頻的編碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器。音頻解復(fù)用在一般后面加copy表示拷貝
-vcodec: 設(shè)定視頻的編碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器,視頻解復(fù)用一般后面加copy表示拷貝
–f: 輸出格式(視頻轉(zhuǎn)碼)
-bf: B幀數(shù)目控制
-g: 關(guān)鍵幀間隔控制(視頻跳轉(zhuǎn)需要關(guān)鍵幀)
-s: 設(shè)定畫(huà)面的寬和高,分辨率控制(352*278)
-i: 設(shè)定輸入流
-ss: 指定開(kāi)始時(shí)間(0:0:05)
-t: 指定持續(xù)時(shí)間(0:05)
-b: 設(shè)定視頻流量,默認(rèn)是200Kbit/s
-aspect: 設(shè)定畫(huà)面的比例
-ar: 設(shè)定音頻采樣率
-ac: 設(shè)定聲音的Channel數(shù)
-r: 提取圖像頻率(用于視頻截圖)
-c:v: 輸出視頻格式
-c:a: 輸出音頻格式
-y: 輸出時(shí)覆蓋輸出目錄已存在的同名文件
使用方式#
不精確裁剪視頻#
# -ss 指定從什么時(shí)間開(kāi)始
# -t 指定需要截取多長(zhǎng)時(shí)間
# -i 指定輸入文件
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
精確時(shí)間裁剪視頻#
- 全部幀都轉(zhuǎn)換為關(guān)鍵幀, 將所有的幀的編碼方式轉(zhuǎn)為幀內(nèi)編碼
#舊版本
ffmpeg -i output.mp4 -sameq -intra keyoutput.mp4
#新版本
ffmpeg -i output.mp4 -strict -2 -qscale 0 -intra keyoutput.mp4
- 再開(kāi)始裁剪視頻
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
合并視頻#
//截取從頭開(kāi)始的30s
ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4
//截取從30s開(kāi)始的30s
ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4
//進(jìn)行視頻的合并
ffmpeg -f concat -i list.txt -c copy concat.mp4
#list.txt
file ./split.mp4
file ./split1.mp4
往流媒體服務(wù)器推流#
##有打印
ffmpeg -re -i 1.mp4 -vcodec libx264 -acodec aac -f flv rtmp://ip:port/rtmplive/home
ffmpeg -re -stream_loop -1 -loglevel quiet -i 1.flv -vcodec copy -f flv rtmp://ip:port/live/test
修改視頻幀率#
// 強(qiáng)制把輸出視頻文件幀率改為 24 fps:-r 幀率
ffmpeg -i input.avi -r 24 output.avi
壓縮視頻#
// 改碼率. 這里的700k可以依照個(gè)人要求改. 越大,最后視頻就越清晰.
ffmpeg -i ./map.mp4 -b:v 700k map1.mp4
MP4 轉(zhuǎn) m3u8 hls ts片段#
MP4 轉(zhuǎn) ts#
ffmpeg -i ./水車.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb ./水車.ts
ts 轉(zhuǎn) m3u8#
// -segment_time 設(shè)定 hls 片段時(shí)長(zhǎng),這里設(shè)定的3s
// sh-%d.ts 是輸出的ts片段的名稱
ffmpeg -i ./水車.ts -c copy -map 0 -f segment -segment_list ./水車.m3u8 -segment_time 3 sh-%d.ts
MP4 直接轉(zhuǎn) m3u8#
mp4 直接轉(zhuǎn) m3u8 比較慢,沒(méi)有把 mp4 先轉(zhuǎn)成 ts,然后再切割 ts效率高
// -hls_time 設(shè)定 hls 片段時(shí)長(zhǎng),這里設(shè)定的 6s
ffmpeg -i ./水車.mp4 -c:v libx264 -hls_time 6 -hls_list_size 0 -c:a aac -strict -2 -f hls ./index.m3u8