ffmpeg的基本用法


title: ffmpeg的基本用法

categories:[ffmpeg]

tags:[音視頻編程]

date: 2021/11/18

作者:hackett

微信公眾號(hào):加班猿


一挎扰、ffmpeg的安裝

1.Centos安裝

FFmpeg 在默認(rèn)的CentOS 8 源倉庫中沒有提供匾浪。你可以選擇通過源文件編譯安裝 FFmpeg,或者使用dnf工具從Negativo17源倉庫中安裝。我們將會(huì)使用第二個(gè)選項(xiàng)亿扁。

完成下面的步驟,在 CentOS 8 上安裝 FFmpeg:

1.Negativo17軟件源依賴EPEL 和 PowerTools 軟件源娇斩。以 root 或者其他有 sudo 權(quán)限的用戶身份運(yùn)行下面的命令夹囚,啟用必須的軟件源:

sudo dnf install epel-release
sudo yum config-manager --set-enabled PowerTools
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo

2.一旦軟件源被啟用纵刘,安裝FFmpeg:

sudo dnf install ffmpeg

3.通過檢測(cè)版本號(hào),驗(yàn)證FFmpeg安裝:

ffmpeg -version

4.Negativo17 軟件源中的ffmpeg當(dāng)前版本是4.2.5

ffmpeg version 4.2.5 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 8 (GCC)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100

2.Windows安裝

官網(wǎng)地址:http://ffmpeg.org/download.html

選擇Windows的版本荸哟,跳轉(zhuǎn)到GitHub下載地址:https://github.com/BtbN/FFmpeg-Builds/releases

在這里插入圖片描述

下載最新的帶share版本的假哎,就是已經(jīng)編譯好了的瞬捕,不用自己再編譯 ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4.zip

解壓出來放到安裝軟件的盤符,添加環(huán)境變量即可 D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin

在這里插入圖片描述

不重啟使Windows環(huán)境變量生效舵抹,cmd肪虎,輸入 set path = D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin

重啟命令提示符終端,測(cè)試效果: cmd掏父,輸入 ffmpeg -version得到如下效果即為成功安裝

在這里插入圖片描述

二笋轨、ffmpeg主要組成部分

1秆剪、libavformat:用于各種音視頻封裝格式的生成和解析赊淑,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能,包含demuxers和muxer庫仅讽;
2陶缺、libavcodec:用于各種類型聲音/圖像編解碼;
3洁灵、libavutil:包含一些公共的工具函數(shù)饱岸;
4、libswscale:用于視頻場(chǎng)景比例縮放徽千、色彩映射轉(zhuǎn)換苫费;
5、libpostproc:用于后期效果處理双抽;
6百框、ffmpeg:是一個(gè)命令行工具,用來對(duì)視頻文件轉(zhuǎn)換格式牍汹,也支持對(duì)電視卡實(shí)時(shí)編碼铐维;
7、ffsever:是一個(gè)HTTP多媒體實(shí)時(shí)廣播流服務(wù)器慎菲,支持時(shí)光平移嫁蛇;
8、ffplay:是一個(gè)簡(jiǎn)單的播放器露该,使用ffmpeg 庫解析和解碼睬棚,通過SDL顯示;

在這組成部分中解幼,需要熟悉基礎(chǔ)概念有

容器(Container)
容器就是一種文件格式抑党,比如flv,mkv等书幕。包含下面5種流以及文件頭信息新荤。
流(Stream)
是一種視頻數(shù)據(jù)信息的傳輸方式,5種流:音頻台汇,視頻苛骨,字幕篱瞎,附件,數(shù)據(jù)痒芝。
幀(Frame)
幀代表一幅靜止的圖像俐筋,分為I幀,P幀严衬,B幀澄者。
編解碼器(Codec)
是對(duì)視頻進(jìn)行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)
復(fù)用/解復(fù)用(mux/demux)
把不同的流按照某種容器的規(guī)則放入容器请琳,這種行為叫做復(fù)用(mux)
把不同的流從某種容器中解析出來粱挡,這種行為叫做解復(fù)用(demux)

查看幫助

可用的bit流 :ffmpeg –bsfs
可用的編解碼器:ffmpeg –codecs
可用的解碼器:ffmpeg –decoders
可用的編碼器:ffmpeg –encoders
可用的過濾器:ffmpeg –filters
可用的視頻格式:ffmpeg –formats
可用的聲道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的協(xié)議:ffmpeg -protocals

三、ffmpeg常用命令

使用 ffmpeg 命令基本形式是:

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
usage: ffmpeg [全局參數(shù)] {[輸入文件參數(shù)] -i 輸入文件地址} ... {[輸出文件參數(shù)] 輸出文件地址} ...

主要全局參數(shù):

-i 設(shè)定輸入流 
-f 設(shè)定輸出格式 
-ss 開始時(shí)間 

輸出視頻文件參數(shù):

-b 設(shè)定視頻流量(碼率)俄精,默認(rèn)為200Kbit/s 
-r 設(shè)定幀速率询筏,默認(rèn)為25 
-s 設(shè)定畫面的寬與高 
-aspect 設(shè)定畫面的比例 
-vn 不處理視頻 
-vcodec 設(shè)定視頻編解碼器,未設(shè)定時(shí)則使用與輸入流相同的編解碼器 
-qscale 0 保留原始的視頻質(zhì)量

輸出音頻文件參數(shù):

-ar 設(shè)定采樣率 
-ac 設(shè)定聲音的Channel數(shù) 
-acodec 設(shè)定聲音編解碼器竖慧,未設(shè)定時(shí)則使用與輸入流相同的編解碼器 
-an 不處理音頻

1.獲取媒體文件信息

ffmpeg -i file_name
ffmpeg -i video_file.mp4
ffmpeg -i audio_file.mp3
ffmpeg -i video_file.mp4 -hide_banner #hide_banner 來隱藏掉ffmpeg本身的信息
ffmpeg -i audio_file.mp3 -hide_banner
在這里插入圖片描述

2.轉(zhuǎn)換媒體文件

ffmpeg 最讓人稱道常用的恐怕就是你輕而易舉的在不同媒體格式之間進(jìn)行自由轉(zhuǎn)換了嫌套。你是要指明輸入和輸出文件名就行了, ffmpeg 會(huì)從后綴名猜測(cè)格式圾旨,這個(gè)方法同時(shí)適用于視頻和音頻文件

下面是一些例子:

ffmpeg -i video_input.mp4 video_output.avi 
ffmpeg -i video_input.webm video_output.flv 
ffmpeg -i audio_input.mp3 audio_output.ogg 
ffmpeg -i audio_input.wav audio_output.flac

你也可以同時(shí)指定多個(gè)輸出后綴:

ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg

這樣會(huì)同時(shí)輸出多個(gè)文件.

想看支持的格式踱讨,可以用:

ffmpeg -formats

同樣的,你可以使用 -hide_banner 來省略一些程序信息砍的。

你可以在輸出文件前使用 -qscale 0 來保留原始的視頻質(zhì)量:

ffmpeg -i video_input.wav -qscale 0 video_output.mp4

3. 從視頻中抽取音頻

為了從視頻文件中抽取音頻痹筛,直接加一個(gè) -vn 參數(shù)就可以了

ffmpeg -i video.mp4 -vn audio.mp3

這會(huì)讓命令復(fù)用原有文件的比特率,一般來說挨约,使用 -ab (音頻比特率)來指定編碼比特率是比較好的:

ffmpeg -i video.mp4 -vn -ab 128k audio.mp3

一些常見的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)味混。

其他的一些常用的參數(shù)比如 -ar (采樣率: 22050, 441000, 48000), -ac (聲道數(shù)), -f (音頻格式, 通常會(huì)自動(dòng)識(shí)別的). -ab 也可以使用 -b:a 來替代. 比如:

ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3

4. 從視頻中抽取視頻(讓視頻靜音)

和之前的要求類似,我們可以使用 -an 來獲得純視頻(之前是 -vn)

ffmpeg -i video_input.mp4 -an -video_output.mp4
ffmpeg -i input.mp4 -vcodec copy -an output.mp4

Note: 這個(gè) -an 標(biāo)記會(huì)讓所有的音頻參數(shù)無效诫惭,因?yàn)樽詈鬀]有音頻會(huì)產(chǎn)生翁锡。

5. 從視頻中提取圖片

這個(gè)功能可能對(duì)很多人都挺有用,比如你可能有一些幻燈片夕土,你想從里面提取所有的圖片馆衔,那么下面這個(gè)命令就能幫你:

ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png

我們來解釋一下這個(gè)命令:

-r 代表了幀率(一秒內(nèi)導(dǎo)出多少張圖像,默認(rèn)25)怨绣, -f 代表了輸出格式(image2 實(shí)際上上 image2 序列的意思)角溃。

最后一個(gè)參數(shù) (輸出文件) 有一個(gè)有趣的命名:它使用 %3d 來指示輸出的圖片有三位數(shù)字 (000, 001, 等等.)。你也可以用 %2d (兩位數(shù)字) 或者 %4d (4位數(shù)字) 篮撑,只要你愿意减细,你可以隨便實(shí)驗(yàn) 一下可以怎么寫!

Note: 同樣也有將圖片轉(zhuǎn)變?yōu)橐曨l/幻燈片的方式赢笨,下面的高級(jí)應(yīng)用中會(huì)講到未蝌。

6. 更改視頻分辨率或長(zhǎng)寬比

對(duì) ffmpeg 來說又是個(gè)簡(jiǎn)單的任務(wù)驮吱,你只需要使用 -s 參數(shù)來縮放視頻就行了:

ffmpeg -i video_input.mov -s 1024x576 video_output.mp4

同時(shí),你可能需要使用 -c:a 來保證音頻編碼是正確的:

ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov

你也可是使用-aspect 來更改長(zhǎng)寬比:

ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4

Note: 在高級(jí)應(yīng)用中還會(huì)提到更強(qiáng)大的方法

7. 為音頻增加封面圖片

有個(gè)很棒的方法把音頻變成視頻萧吠,全程使用一張圖片(比如專輯封面)左冬。當(dāng)你想往某個(gè)網(wǎng)站上傳音頻,但那個(gè)網(wǎng)站又僅接受視頻(比如YouTube, Facebook等)的情況下會(huì)非常有用纸型。

下面是例子:

ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4

只要改一下編碼設(shè)置 (-c:v 是 視頻編碼拇砰, -c:a 是音頻編碼) 和文件的名稱就能用了。

Note: 如果你使用一個(gè)較新的ffmpeg版本(4.x)狰腌,你就可以不指定 -strict experimental

8. 為視頻增加字幕

另一個(gè)常見又很容易實(shí)現(xiàn)的要求是給視頻增加字母除破,比如一部外文電源,使用下面的命令:

ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4

當(dāng)然癌别,你可以指定自己的編碼器和任何其他的音頻視頻參數(shù)皂岔。你可以閱讀這篇文章來了解字幕相關(guān)內(nèi)容 editing subtitles in Linux

9. 壓縮媒體文件

壓縮文件可以極大減少文件的體積展姐,節(jié)約存儲(chǔ)空間,這對(duì)于文件傳輸尤為重要剖毯。通過ffmepg圾笨,有好幾個(gè)方法來壓縮文件體積。

Note: 文件壓縮的太厲害會(huì)讓文件質(zhì)量顯著降低逊谋。

首先擂达,對(duì)于音頻文件,可以通過降低比特率(使用 -b:a-ab):

ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3
ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3

再次重申胶滋,一些常用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k.值越大板鬓,文件所需要的體積就越大。

對(duì)于視頻文件究恤,選項(xiàng)就多了俭令,一個(gè)簡(jiǎn)單的方法是通過降低視頻比特率 (通過 -b:v):

ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4

Note: 視頻的比特率和音頻是不同的(一般要大得多)。

你也可以使用 -crf 參數(shù) (恒定質(zhì)量因子). 較小的crf 意味著較大的碼率部宿。同時(shí)使用 libx264 編碼器也有助于減小文件體積抄腔。這里有個(gè)例子,壓縮的不錯(cuò)理张,質(zhì)量也不會(huì)顯著變化:

ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4

crf 設(shè)置為20 到 30 是最常見的赫蛇,不過您也可以嘗試一些其他的值。

降低幀率在有些情況下也能有效(不過這往往讓視頻看起來很卡):

ffmpeg -i video_input.mp4 -r 24 video_output.mp4

-r 指示了幀率 (這里是 24)雾叭。

你還可以通過壓縮音頻來降低視頻文件的體積悟耘,比如設(shè)置為立體聲或者降低比特率:

ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4

Note: -strict -2-ac 2 是來處理立體聲部分的。

10. 裁剪媒體文件(基礎(chǔ))

想要從開頭開始剪輯一部分织狐,使用T -t 參數(shù)來指定一個(gè)時(shí)間:

ffmpeg -i input_video.mp4 -t 5 output_video.mp4 
ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav

這個(gè)參數(shù)對(duì)音頻和視頻都適用暂幼,上面兩個(gè)命令做了類似的事情:保存一段5s的輸出文件(文件開頭開始算)掘殴。上面使用了兩種不同的表示時(shí)間的方式,一個(gè)單純的數(shù)字(描述)或者 HH:MM:SS (小時(shí), 分鐘, 秒). 第二種方式實(shí)際上指示了結(jié)束時(shí)間粟誓。

也可以通過 -ss 給出一個(gè)開始時(shí)間奏寨,-to 給出結(jié)束時(shí)間:

ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3
ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav 
ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264 
ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg

可以看到 開始時(shí)間 (-ss HH:MM:SS), 持續(xù)秒數(shù) (-t duration), 結(jié)束時(shí)間 (-to HH:MM:SS), 和開始秒數(shù) (-s duration)的用法.

你可以在媒體文件的任何部分使用這些命令。

11.輸出YUV420原始數(shù)據(jù)

對(duì)于一下做底層編解碼的人來說鹰服,有時(shí)候常要提取視頻的YUV原始數(shù)據(jù)病瞳。 怎么坐?很簡(jiǎn)答: ffmpeg -i input.mp4 output.yuv怎么樣悲酷,是不是太簡(jiǎn)單啦套菜?!I枰住逗柴!哈哈(如果你想問yuv的數(shù)據(jù),如何播放顿肺,我不會(huì)告訴你戏溺,RawPlayer挺好用的!屠尊!)

那如果我只想要抽取某一幀YUV呢旷祸? 簡(jiǎn)單,你先用上面的方法讼昆,先抽出jpeg圖片托享,然后把jpeg轉(zhuǎn)為YUV。 比如: 你先抽取10幀圖片浸赫。 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
結(jié)果:

-rw-rw-r-- 1 hackett hackett    296254  7月 20 16:08 pic-001.jpeg
-rw-rw-r-- 1 hackett hackett    300975  7月 20 16:08 pic-002.jpeg
-rw-rw-r-- 1 hackett hackett    310130  7月 20 16:08 pic-003.jpeg
-rw-rw-r-- 1 hackett hackett    268694  7月 20 16:08 pic-004.jpeg
-rw-rw-r-- 1 hackett hackett    301056  7月 20 16:08 pic-005.jpeg
-rw-rw-r-- 1 hackett hackett    293927  7月 20 16:08 pic-006.jpeg
-rw-rw-r-- 1 hackett hackett    340295  7月 20 16:08 pic-007.jpeg
-rw-rw-r-- 1 hackett hackett    430787  7月 20 16:08 pic-008.jpeg
-rw-rw-r-- 1 hackett hackett    404552  7月 20 16:08 pic-009.jpeg
-rw-rw-r-- 1 hackett hackett    412691  7月 20 16:08 pic-010.jpeg

然后闰围,你就隨便挑一張,轉(zhuǎn)為YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv如果-s參數(shù)不寫既峡,則輸出大小與輸入一樣羡榴。當(dāng)然了,YUV還有yuv422p啥的涧狮,你在-pix_fmt 換成yuv422p就行啦炕矮!

12.視頻添加logo

ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4

13.提取視頻ES數(shù)據(jù)

ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264

14.視頻編碼格式轉(zhuǎn)換

比如一個(gè)視頻的編碼是MPEG4,想用H264編碼者冤,咋辦肤视?

ffmpeg -i input.mp4 -vcodec h264 output.mp4

相反也一樣

ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4

15.添加字幕

語法 –vf subtitles=file

ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4

ffmpeg: 高級(jí)使用

現(xiàn)在該開始講述一些高級(jí)的特性了(比如截屏等),讓我們開始吧涉枫。

1. 分割媒體文件

前面已經(jīng)講述了如何裁剪文件邢滑,那么如何分割媒體文件呢?只需要為每個(gè)輸出文件分別指定開始時(shí)間、結(jié)束或者持續(xù)時(shí)間就可以了困后。

看下面這個(gè)例子:

ffmpeg -i video.mp4 -t 00:00:30 video_1.mp4 -ss 00:00:30 video_2.mp4

語法很簡(jiǎn)單乐纸,為第一個(gè)文件指定了 -t 00:00:30 作為持續(xù)時(shí)間(第一個(gè)部分是原始文件的前30秒內(nèi)容),然后指定接下來的所有內(nèi)容作為第二個(gè)文件(從第一部分的結(jié)束時(shí)間開始摇予,也就是 00:00:30)汽绢。

你可以任意指定多少個(gè)部分,嘗試一下吧侧戴,這個(gè)功能真的很厲害宁昭,同時(shí)它也適用用音頻文件。

2. 拼接媒體文件

ffmpeg 也可以進(jìn)行相反的動(dòng)作:把多個(gè)文件合在一起酗宋。

為了實(shí)現(xiàn)這一點(diǎn)积仗,你得用自己順手的編輯器來創(chuàng)建一個(gè)文本文件。

因?yàn)槲蚁矚g使用終端蜕猫,所以這里我用了 touchvim. 文件名無關(guān)緊要寂曹,這里我用 touch 命令創(chuàng)建 video_to_join.txt 文件:

touch videos_to_join.txt

現(xiàn)在,使用 vim 編輯它:

vim videos_to_join.txt

你可以使用任何你喜歡的工具回右,比如nano隆圆,gedit等等。

在文件內(nèi)容中, 輸入您想拼接的文件的完整路徑(文件會(huì)按照順序拼合在一起)楣黍,一行一個(gè)文件匾灶。確保他們擁有相同的后綴名。下面是我的例子:

/home/ubuntu/Desktop/video_1.mp4
/home/ubuntu/Desktop/video_2.mp4
/home/ubuntu/Desktop/video_3.mp4

保存這個(gè)文件租漂,同樣這個(gè)方法適用與任何音頻或者視頻文件。

然后使用下面的命令:

ffmpeg -f concat -i join.txt output.mp4

Note: 使用的輸出文件的名稱是 output.mp4, 因?yàn)槲业妮斎胛募际莔p4的 颊糜。

這樣哩治,你 videos_to_join.txt 里的所有文件都會(huì)被拼接成一個(gè)獨(dú)立的文件了。

3. 將圖片轉(zhuǎn)變?yōu)橐曨l

這會(huì)告訴你如何將圖片變成幻燈片秀衬鱼,同時(shí)也會(huì)告訴你如何加上音頻业筏。

首先我建議您將所有的圖片放到一個(gè)文件夾下面,我把它們放到了 my_photos 里鸟赫,同時(shí)圖片的后綴名最好是 .png 或者 .jpg蒜胖, 不管選那個(gè),他們應(yīng)該是同一個(gè)后綴名抛蚤,否則ffmpeg可能會(huì)工作的不正常台谢,您可以很方便的把 .png 轉(zhuǎn)變?yōu)?.jpg (或者倒過來也行)。

我們這次轉(zhuǎn)換的格式 (-f) 應(yīng)該被設(shè)置為 image2pipe. 你必須使用使用連詞符()來指明輸入岁经。 image2pipe 允許你使用管道 (在命令間使用 |)的結(jié)果而不是文件作為ffmpeg的輸入朋沮。命令結(jié)果便是將所有圖片的內(nèi)容逐個(gè)輸出,還要注意指明視頻編碼器是 copy (-c:v copy) 以正確使用圖片輸入:

cat my_photos/* | ffmpeg -f image2pipe -i - -c:v copy video.mkv

如果你播放這個(gè)文件缀壤,你可能會(huì)覺得只有一部分圖片被加入了樊拓,事實(shí)上所有的圖片都在纠亚,但是ffmpeg 播放它們的時(shí)候太快了,默認(rèn)是23fps筋夏,一秒播放了23張圖片蒂胞。

你應(yīng)該指定幀率 (-framerate) :

cat my_photos/* | ffmpeg -framerate 1 -f image2pipe -i - -c:v copy video.mkv 

在這個(gè)例子里,把幀率設(shè)置為1条篷,也就是每幀(每張圖)會(huì)顯示1秒骗随。

為了加一些聲音,可以使用音頻文件作為輸入 (-i audo_file) 并且設(shè)定copy音頻編碼 (-c:a copy). 你可以同時(shí)為音頻和視頻設(shè)定編碼器拥娄,在輸出文件前設(shè)置就可以了蚊锹。你要計(jì)算一下音頻文件的長(zhǎng)度和圖片張數(shù),已確定合適的幀率稚瘾。比如我的音頻文件是22秒牡昆,圖片有9張,那么幀率應(yīng)該是 9 / 22 大約0.4摊欠,所以我這么輸入命令:

cat my_photos/* | ffmpeg -framerate 0.40 -f image2pipe -i - -i audio.wav -c copy video.mkv

4. 錄制屏幕

通過 ffmpeg 錄制屏幕同樣沒有困難的丢烘,將格式(-f) 設(shè)定為x11grab. 他就會(huì)抓取你的XSERVER. 輸入的話可以這是屏幕編號(hào)(一般都是0:0). 抓取是從左上角開始計(jì)算的,可以指定屏幕分辨率 (-s). 我的屏幕是 1920×1080. 注意屏幕分辨率硬在輸入之前指定t:

ffmpeg -f x11grab -s 1920x1080 -i :0.0 output.mp4

q 或者 CTRL+C 以結(jié)束錄制屏幕些椒。

小技巧:你可以通過命令獲得真實(shí)的分辨率而不是寫死一個(gè)固定的大小

-s $(xdpyinfo | grep dimensions | awk '{print $2;}')

完整的命令這么寫:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 output.mp4

5. 錄制攝像頭

從攝像頭錄制就更簡(jiǎn)單了播瞳,linux上設(shè)備都是在/dev中的,比如 /dev/video0, /dev/video1, etc.:

ffmpeg -i /dev/video0 output.mkv

同樣, q 或者 CTRL+C 來結(jié)束錄制免糕。

6. 錄制聲音

Linux上同時(shí)是使用 ALSApulseaudio 來處理聲音的赢乓。 ffmpeg 可以錄制兩者,不過我要特別說明 pulseaudio, 因?yàn)?Debian 系列的發(fā)行版默認(rèn)用了它石窑。命令如下:

pulseaudio, 你必須強(qiáng)制指定(-f) alsa 然后指定 default 作為輸入t (-i default):

ffmpeg -f alsa -i default output.mp3

Note: 在你系統(tǒng)音頻設(shè)置里牌芋,應(yīng)該能看到默認(rèn)的錄音設(shè)備。

我經(jīng)常玩吉他松逊,我平時(shí)使用一個(gè)專業(yè)音頻設(shè)備才能錄制聲音躺屁,當(dāng)我發(fā)現(xiàn)ffmpeg也可以很輕松的錄制的時(shí)候頗為驚訝。

錄制小貼士

對(duì)于錄制任務(wù)來說经宏,通常都需要指定編碼器以及幀率犀暑,之前講過的參數(shù)當(dāng)然也可以用到這里來!

ffmpeg -i /dev/video0 -f alsa -i default -c:v libx264 -c:a flac -r 30 output.mkv

有時(shí)候不直接錄音烁兰,而是在錄屏/錄像的時(shí)候給一個(gè)音頻文件耐亏,那么可以這么做:

ffmpeg -f x11grab -s $(xdpyinfo | grep dimensions | awk '{print $2;}') -i :0.0 -i audio.wav -c:a copy output.mp4

Note: ffmpeg 使用片段錄取,所有有時(shí)候非常短的錄制可能不會(huì)保存文件缚柏。我建議錄地可以稍微長(zhǎng)一些(然后后期裁剪)苹熏,已保證錄制的文件成功寫到磁盤上。

7.截圖

每隔一秒截一張圖

 ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png

每隔20秒截一張圖

 ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

ffmpeg中的過濾器的基本使用

過濾器ffmpeg 中最為強(qiáng)大的功能。在ffmepg中有數(shù)不甚數(shù)的過濾器存在轨域,可以滿足各種編輯需要袱耽。因?yàn)檫^濾器實(shí)在太多了,這里只會(huì)簡(jiǎn)單講述幾個(gè)常用的干发。

使用 過濾的基本結(jié)構(gòu)是:

ffmpeg -i input.mp4 -vf "filter=setting_1=value_1:setting_2=value_2,etc" output.mp4
ffmpeg -i input.wav -af "filter=setting_1=value_1:setting_2=value_2,etc" output.wav

可以指定視頻過濾器 (-vf, -filter:v的簡(jiǎn)寫) 和 音頻過濾器 (-af, -filter:a的簡(jiǎn)寫). 過濾器的內(nèi)容寫到雙引號(hào)里面 () 并且可以使用逗號(hào)(,)連接朱巨。你可以使用任意數(shù)量的過濾器(我寫了個(gè)etc代表更多的,這不是做一個(gè)真實(shí)的過濾器)枉长。

過濾器設(shè)定的通常格式是:

filter=setting_2=value_2:setting_2=value_2

過濾器不同的值使用冒號(hào)分割冀续。

你甚至可以在值里面使用進(jìn)行數(shù)學(xué)符號(hào)計(jì)算。

Note: 參考 ffmpeg 過濾器手冊(cè)*.*查看更多高級(jí)用法

這里舉幾個(gè)例子來說明視頻和音頻的過濾器必峰。

1. 視頻縮放

這是個(gè)簡(jiǎn)單過濾器洪唐,設(shè)定里只有 widthheight:

ffmpeg -i input.mp4 -vf "scale=w=800:h=600" output.mp4

我說過你可以使用數(shù)學(xué)運(yùn)算來給值:

ffmpeg -i input.mkv -vf "scale=w=1/2*in_w:h=1/2*in_h" output.mkv

很明顯,這個(gè)命令讓輸入的尺寸變成了輸入尺寸(in_w, in_h)的1/2.

2. 視頻裁剪

類似縮放吼蚁,這個(gè)設(shè)定也有 widthheight 凭需,另外可以指定裁剪的原點(diǎn)(默認(rèn)是視頻的中心)

ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4 
ffmpeg -i input.mkv -vf "crop=w=400:h=400" output.mkv

第二個(gè)命令裁剪原點(diǎn)是視頻的中心點(diǎn)(因?yàn)槲覜]有給x和y坐標(biāo)),第一個(gè)命令會(huì)從左上角開始裁剪 (x=0:y=0).

這里也有一個(gè)使用數(shù)學(xué)計(jì)算的例子:

ffmpeg -i input.mkv -vf "crop=w=3/4*in_w:h=3/4*in_h" output.mkv

這會(huì)把視頻裁剪剩下原大小的3/4/肝匆。

3. 視頻旋轉(zhuǎn)

你可以指定一個(gè)弧度粒蜈,順時(shí)針旋轉(zhuǎn)視頻。為了讓計(jì)算簡(jiǎn)單一些旗国,你可以給角度然后乘以 PI/180:

ffmpeg -i input.avi -vf "rotate=90*PI/180" 
ffmpeg -i input.mp4 -vf "rotate=PI"

第一個(gè)命令將視頻順時(shí)針旋轉(zhuǎn)90°枯怖,第二個(gè)則是上下顛倒了視頻(翻轉(zhuǎn)了180°)。

4. 音頻聲道重映射

有的時(shí)候能曾,你的音頻只有右耳可以聽到聲音度硝,那么這個(gè)功能就很有用了。你可以讓聲音同時(shí)在左右聲道出現(xiàn):

ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3

這將右聲道(1)同時(shí)映射到左(0)右(1)兩個(gè)聲道(左邊的數(shù)字是輸入寿冕,右邊的數(shù)字是輸出)塘淑。

5. 更改音量

你可以將音量大小乘以一個(gè)實(shí)數(shù)(可以是整數(shù)也可以不是),你只需要給出那個(gè)數(shù)大小就行了蚂斤。

ffmpeg -i input.wav -af "volume=1.5" output.wav 
ffmpeg -i input.ogg -af "volume=0.75" output.ogg

第一個(gè)將音量變?yōu)?.5倍,第二個(gè)則讓音量變成了原來的1/4那么安靜槐沼。

技巧:更改播放速度

這里會(huì)介紹視頻(不影響音頻)和音頻的過濾器曙蒸。

  1. 視頻

視頻過濾器是 setpts (PTS = presentation time stamp). 這個(gè)參數(shù)以一種有趣的方式工作版保,因?yàn)槲覀冃薷牡氖荘TS蚕泽,所以較大的數(shù)值意味著較慢的播放速度次洼,反之亦然:

ffmpeg -i input.mkv -vf "setpts=0.5*PTS" output.mkv 
ffmpeg -i input.mp4 -vf "setpts=2*PTS" output,mp4

第一個(gè)命令讓播放速度加倍了沟突,第二個(gè)則是讓播放速度降低了一半蝉衣。

2. 音頻

這里的過濾器是 atempo. 這里有個(gè)限制肪凛,它只接受 0.5(半速) 到 2 (倍速)之間的值劳景。為了越過這個(gè)限制配紫,你可以鏈?zhǔn)绞褂眠@個(gè)過濾器:

ffmpeg -i input.wav -af "atempo=0.75" output.wav 
ffmpeg -i input.mp3 -af "atempo=2.0,atempo=2.0" ouutput.mp3

第一個(gè)命令讓音頻速度慢了1/4,第二個(gè)則是加速到原來的4(2*2)倍审孽。

Note: 如果想在同一個(gè)命令中同時(shí)修改視頻和音頻的速度县袱,你得查看一下 filtergraphs.

如果你覺得文章還不錯(cuò),可以給個(gè)"三連"

我是加班猿佑力,我們下期見

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末式散,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子打颤,更是在濱河造成了極大的恐慌暴拄,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件编饺,死亡現(xiàn)場(chǎng)離奇詭異乖篷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)透且,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門撕蔼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人石蔗,你說我怎么就攤上這事罕邀。” “怎么了养距?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵诉探,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我棍厌,道長(zhǎng)肾胯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任耘纱,我火速辦了婚禮敬肚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘束析。我一直安慰自己艳馒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布员寇。 她就那樣靜靜地躺著弄慰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝶锋。 梳的紋絲不亂的頭發(fā)上陆爽,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音扳缕,去河邊找鬼慌闭。 笑死别威,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驴剔。 我是一名探鬼主播省古,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼仔拟!你這毒婦竟也來了衫樊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤利花,失蹤者是張志新(化名)和其女友劉穎科侈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炒事,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臀栈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挠乳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片权薯。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睡扬,靈堂內(nèi)的尸體忽然破棺而出盟蚣,到底是詐尸還是另有隱情,我是刑警寧澤卖怜,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布屎开,位于F島的核電站,受9級(jí)特大地震影響马靠,放射性物質(zhì)發(fā)生泄漏奄抽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一甩鳄、第九天 我趴在偏房一處隱蔽的房頂上張望逞度。 院中可真熱鬧,春花似錦妙啃、人聲如沸档泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茁瘦。三九已至,卻和暖如春储笑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背圆恤。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工突倍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腔稀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓羽历,卻偏偏與公主長(zhǎng)得像焊虏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秕磷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ffmpeg主要組成部分 1诵闭、libavformat:用于各種音視頻封裝格式的生成和解析,包括獲取解碼所需信息以生...
    旁界001閱讀 148,248評(píng)論 11 76
  • 寫在前面 如果您對(duì)音視頻技術(shù)感興趣澎嚣,可以訂閱我的專題:音視頻專輯也可以關(guān)注我的簡(jiǎn)書賬戶: 張芳濤疏尿,我后期會(huì)發(fā)布更多...
    張芳濤閱讀 11,566評(píng)論 11 38
  • [TOC] 基本知識(shí)FFmpeg 資源網(wǎng)站音視頻流容器聲道命令種類處理流程 下載 目錄結(jié)構(gòu) 模塊列表顯示所有可用的...
    Afra55閱讀 1,338評(píng)論 0 1
  • 前言 FFMPEG是特別強(qiáng)大的專門用于處理音視頻的開源庫褥琐。你既可以使用它的API對(duì)音視頻進(jìn)行處理,也可以使用它提供...
    寫代碼的向日葵閱讀 958評(píng)論 0 1
  • ffmpeg主要組成部分 1晤郑、libavformat:用于各種音視頻封裝格式的生成和解析敌呈,包括獲取解碼所需信息以生...
    Ch_Running閱讀 487評(píng)論 0 0