FFMPEG命令入門到提高,一篇文章就夠了


FFMPEG命令入門到提高,一篇文章就夠了


FFMPEG簡介

FFmpeg的名稱來自MPEG視頻編碼標準,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。可以輕易地實現多種視頻格式之間的相互轉換。

FFmpeg的用戶有Google,Facebook,Youtube,優酷,愛奇藝,土豆等


基礎知識

1.容器/文件(Conainer/File):即特定格式的多媒體文件,比如mp4、flv、mkv等。

2.媒體流(Stream):表示時間軸上的一段連續數據,如一段聲音數據、一段視頻數據或一段字幕數據,可以是壓縮的,也可以是非壓縮的,壓縮的數據需要關聯特定的編解碼器。

3.數據幀/數據包(Frame/Packet):通常,一個媒體流是由大量的數據幀組成的,對於壓縮數據,幀對應著編解碼器的最小處理單元,分屬於不同媒體流的數據幀交錯存儲於容器之中。

一般情況下:

Frame對應壓縮前的數據,Packet對應壓縮後的數據。

4.編解碼器(Codec):以幀為單位實現壓縮數據和原始數據之間的相互轉換的

5.複用(mux):把不同的流按照某種容器的規則放入容器,這種行為叫做複用(mux)

6.解複用(mux):把不同的流從某種容器中解析出來,這種行為叫做解複用(demux)

7.碼率和幀率是視頻文件的最重要的基本特徵,對於他們的特有設置會決定視頻質量。如果我們知道碼率和時長那麼可以很容易計算出輸出文件的大小。

8.幀率:幀率也叫幀頻率,幀率是視頻文件中每一秒的幀數,肉眼想看到連續移動圖像至少需要15幀。

9.碼率:比特率(也叫碼率,數據率)是一個確定整體視頻/音頻質量的參數,秒為單位處理的位數,碼率和視頻質量成正比,在視頻文件中中比特率用bps來表達。


FFMPEG命令入門到提高,一篇文章就夠了


FFMPEG命令入門到提高,一篇文章就夠了


FFMPEG命令行環境搭建


1. 到ffmpeg官方下載已經編譯好的Windows shared庫;

2. 將執行文件ffmpeg.exe ffplay.exe ffprobe.exe拷貝到C:\\Windows目錄;

3. 將相應的動態庫拷貝到C:\\Windows\\SysWOW64目錄;

注:WOW64 (Windows-on-Windows 64-bit)

4. 在命令行窗口輸入ffmpeg -version 查看版本,以卻確定環境是否搭建成功。


FFMPEG如何查詢命令幫助文檔

ffmpeg/ffplay/ffprobe區別

ffmpeg:

Hyper fast Audio and Video encoder

超快音視頻編碼器(類似愛剪輯)

ffplay:

Simple media player簡單媒體播放器

ffprobe:

Simple multimedia streams analyzer

簡單多媒體流分析器

ffprobe命令查看幫助文檔

所有信息:ffprobe -h

usage:

ffprobe [OPTIONS] [INPUT_FILE]

ffmpeg/ffplay/ffprobe部分參數通用,部分參數不通用,在使用時需要注意。

ffmpeg命令查看幫助文檔

FFMPEG命令入門到提高,一篇文章就夠了


ffplay命令查看幫助文檔

所有信息:ffplay -h

usage:

ffplay [options] input_file


ffmpeg音視頻處理流程​


FFMPEG命令入門到提高,一篇文章就夠了

ffmpeg命令分類查詢


FFMPEG命令入門到提高,一篇文章就夠了


ffplay播放控制


FFMPEG命令入門到提高,一篇文章就夠了


ffplay命令選項

ffplay命令-主要選項


FFMPEG命令入門到提高,一篇文章就夠了


FFMPEG命令入門到提高,一篇文章就夠了

ffplay命令-高級選項


FFMPEG命令入門到提高,一篇文章就夠了


FFMPEG命令入門到提高,一篇文章就夠了


ffplay命令播放媒體

播放本地文件播放YUV數據

ffplay -window_title "test time" -ss 2 -t 10 -autoexit test.mp4

ffplay buweishui.mp3

播放網絡流

ffplay -window_title "rtmp stream" rtmp://202.69.69.180:443/webcast/bshdlive-pc

強制解碼器

mpeg4解碼器:ffplay -vcodec mpeg4 test.mp4

h264解碼器:ffplay -vcodec h264 test.mp4

禁用音頻或視頻

禁用音頻:ffplay test.mp4 -an

禁用視頻:ffplay test.mp4 -vn

ffplay -pixel_format yuv420p -video_size 320x240 -framerate 5 yuv420p_320x240.yuv

播放RGB數據

ffplay -pixel_format rgb24 -video_size 320x240 -i rgb24_320x240.rgb

ffplay -pixel_format rgb24 -video_size 320x240 -framerate 5 -i rgb24_320x240.rgb

播放PCM數據

ffplay -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm

-ar set audio sampling rate (in Hz) (from 0 to INT_MAX) (default 0)

-ac set number of audio channels (from 0 to INT_MAX) (default 0)

ffplay簡單過濾器


視頻旋轉

ffplay -i test.mp4 -vf transpose=1

視頻反轉

ffplay test.mp4 -vf hflip

ffplay test.mp4 -vf vflip

視頻旋轉和反轉

ffplay test.mp4 -vf hflip,transpose=1

音頻變速播放

ffplay -i test.mp4 -af atempo=2

視頻變速播放

ffplay -i test.mp4 -vf setpts=PTS/2

音視頻同時變速

ffplay -i test.mp4 -vf setpts=PTS/2 -af atempo=2

ffmpeg命令參數說明


FFMPEG命令入門到提高,一篇文章就夠了


ffmpeg命令�提取音視頻數據

保留封裝格式

ffmpeg -i test.mp4 -acodec copy -vn audio.mp4

ffmpeg -i test.mp4 -vcodec copy -an video.mp4

提取視頻

保留編碼格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264

強制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h264

提取音頻

保留編碼格式:ffmpeg -i test.mp4 -acodec copy -vn test.aac

強制格式:ffmpeg -i test.mp4 -acodec libmp3lame -vn test.mp3

ffmpeg命令提取像素格式和PCM數據

ffmpeg命令提取像素格式

提取YUV

提取3秒數據,分辨率和源視頻一致

ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p yuv420p_orig.yuv

提取3秒數據,分辨率轉為320x240

ffmpeg -i test_1280x720.mp4 -t 3 -pix_fmt yuv420p -s 320x240 yuv420p_320x240.yuv

提取RGB

提取3秒數據,分辨率轉為320x240

ffmpeg -i test.mp4 -t 3 -pix_fmt rgb24 -s 320x240 rgb24_320x240.rgb

RGB和YUV之間的轉換

ffmpeg -s 320x240 -pix_fmt yuv420p -i yuv420p_320x240.yuv -pix_fmt rgb24 rgb24_320x240_2.rgb

提取PCM

ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le.pcm

ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav

ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav

ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f f32le 48000_2_f32le.pcm

ffmpeg -i test.mp4 -t 10 -vn -ar 48000 -ac 2 -f f32le 48000_2_f32le_2.pcm

ffmpeg命令轉封裝

ffmpeg命令轉封裝

保持編碼格式:

ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.ts

ffmpeg -i test.mp4 -codec copy test_copy2.ts

改變編碼格式:

ffmpeg -i test.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv

修改幀率:

ffmpeg -i test.mp4 -r 15 -codec copy output.mp4 (錯誤命令)

ffmpeg -i test.mp4 -r 15 output2.mp4

修改視頻碼率:

ffmpeg -i test.mp4 -b 400k output_b.mkv (此時音頻也被重新編碼)

修改視頻碼率:

ffmpeg -i test.mp4 -b:v 400k output_bv.mkv

修改音頻碼率:

ffmpeg -i test.mp4 -b:a 192k output_ba.mp4

如果不想重新編碼video,需要加上-vcodec copy

修改音視頻碼率:

ffmpeg -i test.mp4 -b:v 400k -b:a 192k output_bva.mp4

修改視頻分辨率:

ffmpeg -i test.mp4 -s 480x270 output_480x270.mp4

修改音頻採樣率:

ffmpeg -i test.mp4 -ar 44100 output_44100hz.mp4

ffmpeg命令過濾器

生成測試文件

找三個不同的視頻每個視頻截取10秒內容

ffmpeg -i 沙海02.mp4 -ss 00:05:00 -t 10 -codec copy 1.mp4

ffmpeg -i 復仇者聯盟3.mp4 -ss 00:05:00 -t 10 -codec copy 2.mp4

ffmpeg -i 紅海行動.mp4 -ss 00:05:00 -t 10 -codec copy 3.mp4

如果音視頻格式不統一則強制統一為 -vcodec libx264 -acodec aac

將上述1.mp4/2.mp4/3.mp4轉成ts格式

ffmpeg -i 1.mp4 -codec copy -vbsf h264_mp4toannexb 1.ts

ffmpeg -i 2.mp4 -codec copy -vbsf h264_mp4toannexb 2.ts

ffmpeg -i 3.mp4 -codec copy -vbsf h264_mp4toannexb 3.ts

轉成flv格式

ffmpeg -i 1.mp4 -codec copy 1.flv

ffmpeg -i 2.mp4 -codec copy 2.flv

ffmpeg -i 3.mp4 -codec copy 3.flv

分離某些封裝格式(例如MP4/FLV/MKV等)中的H.264的時候,需要首先寫入SPS和PPS,否則會導致分離出來的數據沒有SPS、PPS而無法播放。H.264碼流的SPS和PPS信息存儲在AVCodecContext結構體的extradata中。需要使用ffmpeg中名稱為“h264_mp4toannexb”的bitstream filter處理

開始拼接文件

以MP4格式進行拼接

方法1:ffmpeg -i "concat:1.mp4|2.mp4|3.mp4" -codec copy out_mp4.mp4

方法2:ffmpeg -f concat -i mp4list.txt -codec copy out_mp42.mp4

以TS格式進行拼接

方法1:ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out_ts.mp4

方法2:ffmpeg -f concat -i tslist.txt -codec copy out_ts2.mp4

以FLV格式進行拼接

方法1:ffmpeg -i "concat:1.flv|2.flv|3.flv" -codec copy out_flv.mp4

方法2:ffmpeg -f concat -i flvlist.txt -codec copy out_flv2.mp4

方法1只適用部分封裝格式,比如TS

建議:

(1)使用方法2進行拼接

(2)轉成TS格式再進行拼接

測試不同編碼拼接

修改音頻編碼

ffmpeg -i 2.mp4 -vcodec copy -acodec ac3 -vbsf h264_mp4toannexb 2.ts

ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out1.mp4 結果第二段沒有聲音

修改音頻採樣率

ffmpeg -i 2.mp4 -vcodec copy -acodec aac -ar 96000 -vbsf h264_mp4toannexb 2.ts

ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out2.mp4 第二段播放異常

修改視頻編碼格式

ffmpeg -i 1.mp4 -acodec copy -vcodec libx265 1.ts

ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out3.mp4

修改視頻分辨率

ffmpeg -i 1.mp4 -acodec copy -vcodec libx264 -s 800x472 -vbsf h264_mp4toannexb 1.ts

ffmpeg -i "concat:1.ts|2.ts|3.ts" -codec copy out4.mp4

注意:

把每個視頻封裝格式也統一為ts,拼接輸出的時候再輸出你需要的封裝格式,比如MP4

視頻分辨率可以不同,但是編碼格式需要統一

音頻編碼格式需要統一,音頻參數(採樣率/聲道等)也需要統一

fmpeg命令圖片與視頻互轉​

截取一張圖片

ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg

ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp

-i 輸入

-y 覆蓋

-f 格式 image2 一種格式

-ss 起始值

-vframes 幀 如果大於1 那麼 輸出加%03d test%03d.jpg

-s 格式大小size

轉換視頻為圖片(每幀一張圖):

ffmpeg -i test.mp4 -t 5 -s 640x360 -r 15 frame%03d.jpg

圖片轉換為視頻:  

ffmpeg -f image2 -i frame%03d.jpg -r 25 video.mp4

從視頻中生成GIF圖片

ffmpeg -i test.mp4 -t 5 -r 1 image1.gif

ffmpeg -i test.mp4 -t 5 -r 25 -s 640x360 image2.gif

將 GIF 轉化為 視頻

ffmpeg -f gif -i image2.gif image2.mp4

FFMPEG命令入門到提高,一篇文章就夠了

FFMPEG命令入門到提高,一篇文章就夠了


  • 另外還有一些關於c++ Linux後臺服務器開發的一些知識點分享:Linux,Nginx,MySQL,Redis,P2P,K8S,Docker,TCP/IP,協程,DPDK,webrtc,音視頻等等視頻。
  • 喜歡的朋友可以後臺私信【1】獲取學習視頻

    附上一份音視頻學習課程大綱給大家


    FFMPEG命令入門到提高,一篇文章就夠了


    分享到:


    相關文章: