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命令行環境搭建

  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命令查看幫助文檔
在這裏插入圖片描述
ffplay命令查看幫助文檔

所有信息:ffplay -h
usage:
ffplay [options] input_file

ffmpeg音視頻處理流程​

在這裏插入圖片描述

ffmpeg命令分類查詢

在這裏插入圖片描述

ffplay播放控制

在這裏插入圖片描述

ffplay命令選項

ffplay命令-主要選項
在這裏插入圖片描述
在這裏插入圖片描述
ffplay命令-高級選項
在這裏插入圖片描述
在這裏插入圖片描述

ffplay命令播放媒體

播放本地文件
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
播放YUV數據
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 -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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章