一:FFmpeg音視訊處理流程
案例:
二:FFmpeg指令基本分類
官方網站:https://ffmpeg.org/documentation.html
官方文檔:https://ffmpeg.org/ffmpeg.html
(一)基本資訊查詢指令
詳細見:https://www.jianshu.com/p/a6e711cd3f8d
(二) 錄制指令
1.mac下面的指令
ffmpeg -f avfoundation -i 1 -r 30 out.yuv #注釋:使用avfoundation以30幀的頻率進行錄屏輸出為out.yuv檔案
-f : 指定使用avfoundation采集資料,設定輸出裝置
-i :指定從哪采集資料,它是一個檔案索引号,在MAC上,1代表桌面
-r : 指定幀率
錄制音頻:https://www.jianshu.com/p/e63c063987b6
2.其他裝置下:https://blog.csdn.net/shaosunrise/article/details/81068080
3.基于2中測試linux使用指令
(1)檢視裝置
ffmpeg -devices -hide_banner
注:-hide_banner 所有FFmpeg工具通常都會顯示版權聲明、建構選項和庫版本(如下圖所示)。此選項可用于禁止列印此資訊。
(2)錄制視訊(使用裝置中x11grab)
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 v-out.mp4
上面的參數,指的是從螢幕的左上角(x=100, y=200)的位置,錄制分辨率為1024×768的視訊。
-i :0.0+100,200 其中:0.0是X11服務的顯示螢幕号,與DISPLAY環境變量相同:
DISPLAY=:0.0
在Linux/Unix類作業系統上, DISPLAY用來設定将圖形顯示到何處.
直接登陸圖形界面或者登陸指令行界面後使用startx啟動圖形, DISPLAY環境變量将自動設定為:0.0, 此時可以打開終端, 輸出圖形程式的名稱(比如xclock)來啟動程式, 圖形将顯示在本地視窗上, 在終端上輸入printenv檢視目前環境變量, 輸出結果中有如下内容:
DISPLAY 環境變量格式如下host:NumA.NumB,
host:指Xserver所在的主機主機名或者ip位址, 圖形将顯示在這一機器上, 可以是啟動了圖形界面的Linux/Unix機器, 也可以是安裝了Exceed, X-Deep/32等Windows平台運作的Xserver的Windows機器.
如果Host為空, 則表示Xserver運作于本機, 并且圖形程式(Xclient)使用unix socket方式連接配接到Xserver,而不是TCP方式.
使用TCP方式連接配接時, NumA為連接配接的端口減去6000的值, 如果NumA為0, 則表示連接配接到6000端口; 使用unix socket方式連接配接時則表示連接配接的unix socket的路徑, 如果為0, 則表示連接配接到/tmp/.X11-unix/X0 .
NumB則幾乎總是0.
100是抓取時的x偏移量,200是y偏移量。
ffplay v-out.mp4 #讀取視訊
(3)基于(2)使用ALSA同時錄制聲音:https://blog.csdn.net/rong11417/article/details/102880549
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i hw:0 av-out.mkv
ALSA (Advanced Linux Sound Architecture)裝置(這裡作為輸入裝置)。
要在配置過程中啟用這個輸入裝置,您需要在系統上安裝libasound。該裝置允許從ALSA裝置(裝置存在)捕獲。要捕獲的裝置名稱必須是ALSA(card identifier)卡辨別符。ALSA辨別符具有文法:
hw:CARD[,DEV[,SUBDEV]] #其中DEV和SUBDEV元件是可選的。這三個參數(順序:CARD、DEV、SUBDEV)指定卡号或辨別符、裝置号和子裝置号(-1表示任意)。
要檢視系統目前識别的cards清單,請檢查檔案/proc/asound/cards和/proc/asound/devices.
或者使用以下指令顯示詳細資訊:
aplay -l
arecord -l
例如,要使用ffmpeg從卡id為0的ALSA裝置捕獲,可以運作指令:
ffmpeg -f alsa -i hw:0 alsaout.wav
-ac[:stream_specifier] channels (input/output,per-stream)
設定音頻通道數。對于輸出流,預設設定為輸入音頻通道的數量。對于輸入流,此選項僅對音頻抓取裝置和原始demuxers有意義,并映射到相應的demuxer選項。
(三)分解與複用
1.檔案格式轉換
ffmpeg -i gfxm.mp4 -vcodec copy -acodec copy out.flv #音視訊編碼處理方式都是copy,不改變
ffmpeg version N-101559-ga1cd419 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared
libavutil 56. 68.100 / 56. 68.100
libavcodec 58.132.100 / 58.132.100
libavformat 58. 74.100 / 58. 74.100
libavdevice 58. 12.100 / 58. 12.100
libavfilter 7.109.100 / 7.109.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Multimedia Cloud Transcode (cloud.baidu.com)
Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Output #0, flv, to 'out.flv':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.74.100
Stream #0:0(und): Video: h264 (High) ([7][0][0][0] / 0x0007), yuv420p, 864x486 [SAR 1:1 DAR 16:9], q=2-31, 679 kb/s, 25 fps, 25 tbr, 1k tbn, 12800 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) ([10][0][0][0] / 0x000A), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.00 bitrate=N/A speed= frame= 3024 fps=0.0 q=-1.0 Lsize= 11128kB time=00:02:01.06 bitrate= 753.0kbits/s speed=3.03e+03x
video:10028kB audio:954kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.330767%
轉換時産生的參數
ffplay out.flv
ffplay version N-101559-ga1cd419 Copyright (c) 2003-2021 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared
libavutil 56. 68.100 / 56. 68.100
libavcodec 58.132.100 / 58.132.100
libavformat 58. 74.100 / 58. 74.100
libavdevice 58. 12.100 / 58. 12.100
libavfilter 7.109.100 / 7.109.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
Input #0, flv, from 'out.flv':= 0KB vq= 0KB sq= 0B f=0/0
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.74.100
Duration: 00:02:01.17, start: 0.057000, bitrate: 752 kb/s
Stream #0:0: Video: h264 (High), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc
Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp, 64 kb/s
11.07 A-V: 0.036 fd= 0 aq= 10KB vq= 18KB sq= 0B f=0/0
播放時産生參數
2.抽取視訊
ffmpeg -i input_file -vcodec copy -an output_file_video #-an表示不需要音頻資料
ffmpeg -i gfxm.mp4 -vcodec copy -an out.h264 #注意:字尾需要對應視訊/音頻編碼
ffplay version N-101559-ga1cd419 Copyright (c) 2003-2021 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared
libavutil 56. 68.100 / 56. 68.100
libavcodec 58.132.100 / 58.132.100
libavformat 58. 74.100 / 58. 74.100
libavdevice 58. 12.100 / 58. 12.100
libavfilter 7.109.100 / 7.109.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
Input #0, h264, from 'out.h264': 0KB vq= 0KB sq= 0B f=0/0
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1200k tbn, 50 tbc
nan M-V: nan fd= 1 aq= 0KB vq= 64KB sq= 0B f=0/0
ffplay out.h264
3.抽取音頻
ffmpeg -i input_file -vcodec copy -vn output_file_audio #-vn表示不需要視訊資料
ffmpeg -i gfxm.mp4 -acodec copy -vn out.aac #注意:字尾需要對應視訊/音頻編碼
ffplay version N-101559-ga1cd419 Copyright (c) 2003-2021 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared
libavutil 56. 68.100 / 56. 68.100
libavcodec 58.132.100 / 58.132.100
libavformat 58. 74.100 / 58. 74.100
libavdevice 58. 12.100 / 58. 12.100
libavfilter 7.109.100 / 7.109.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
[aac @ 0x7fbf5c0009c0] Estimating duration from bitrate, this may be inaccurate
Input #0, aac, from 'out.aac':
Duration: 00:03:02.33, bitrate: 44 kb/s
Stream #0:0: Audio: aac (LC), 44100 Hz, stereo, fltp, 44 kb/s
5.99 M-A: 0.000 fd= 0 aq= 8KB vq= 0KB sq= 0B f=0/0
ffplay out.aac
(四)處理原始資料指令
補充:音視訊開發基礎概述 - PCM、YUV、H264、常用軟體介紹
1.提取YUV資料(對于視訊的裸資料而言,用得更多的是 YUV 資料格式,其中 “Y” 表示明亮度(Luminance 或 Luma),即灰階值;而 “U” 和 “V” 表示的則是色度(Chrominance 或 Chroma),作用是描述影像色彩及飽和度,指定像素的顔色。)
-c:v 表示對v(視訊)進行c(編碼)
-pix_fmt 指定了視訊的像素格式
ffmpeg -i gfxm.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv #注意:-pix_fmt是指定輸出的資料編碼(可以與原來的視訊編碼不一緻,但是會出現視訊亂碼等系列問題)
ffmpeg version N-101559-ga1cd419 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared
libavutil 56. 68.100 / 56. 68.100
libavcodec 58.132.100 / 58.132.100
libavformat 58. 74.100 / 58. 74.100
libavdevice 58. 12.100 / 58. 12.100
libavfilter 7.109.100 / 7.109.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Multimedia Cloud Transcode (cloud.baidu.com)
Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> rawvideo (native))
Press [q] to stop, [?] for help
Output #0, rawvideo, to 'out.yuv':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.74.100
Stream #0:0(und): Video: rawvideo (I420 / 0x30323449), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 125971 kb/s, 25 fps, 25 tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc58.132.100 rawvideo
frame= 1 fps=0.0 q=-0.0 size= 512kB time=00:00:00.04 bitrate=104857.6kbitframe= 763 fps=0.0 q=-0.0 size= 469248kB time=00:00:30.52 bitrate=125952.8kbitframe= 1213 fps=1194 q=-0.0 size= 745984kB time=00:00:48.52 bitrate=125950.1kbiframe= 1484 fps=974 q=-0.0 size= 912640kB time=00:00:59.36 bitrate=125949.2kbitframe= 1643 fps=812 q=-0.0 size= 1010432kB time=00:01:05.72 bitrate=125950.4kbitframe= 1761 fps=503 q=-0.0 size= 1083136kB time=00:01:10.44 bitrate=125966.1kbitframe= 2018 fps=504 q=-0.0 size= 1241088kB time=00:01:20.72 bitrate=125953.8kbitframe= 2183 fps=483 q=-0.0 size= 1342720kB time=00:01:27.32 bitrate=125968.4kbitframe= 2313 fps=461 q=-0.0 size= 1422592kB time=00:01:32.52 bitrate=125960.6kbitframe= 2435 fps=441 q=-0.0 size= 1497600kB time=00:01:37.40 bitrate=125958.3kbitframe= 2554 fps=424 q=-0.0 size= 1570816kB time=00:01:42.16 bitrate=125960.5kbitframe= 2680 fps=411 q=-0.0 size= 1648384kB time=00:01:47.20 bitrate=125966.1kbitframe= 2807 fps=399 q=-0.0 size= 1726464kB time=00:01:52.28 bitrate=125963.6kbitframe= 2935 fps=390 q=-0.0 size= 1805056kB time=00:01:57.40 bitrate=125954.2kbitframe= 3024 fps=384 q=-0.0 Lsize= 1860044kB time=00:02:00.96 bitrate=125971.2kbits/s speed=15.4x
video:1860044kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
提取産生參數
由于資料被變為原始資料,是以播放時要指定像素大小,否則出現以下問題:
ffplay out.yuv -s 864x486 #大小通過提取原始資料時産生的參數擷取(在input中)
2.提取PCM資料(通常音頻的裸資料格式為脈沖編碼調制(Pulse-code modulation,PCM)資料)
ffmpeg -i gfxm.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm #-ar 采樣率 -ac 雙聲道 -f PCM資料存儲格式 s有符号 16位 le小端存儲
ffmpeg version N-101559-ga1cd419 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 20160609
configuration: --enable-shared --prefix=/usr/local/ffmpeg --enable-gpl --enable-libx264 --enable-libx265 --enable-debug --disable-optimizations --enable-pthreads --enable-shared
libavutil 56. 68.100 / 56. 68.100
libavcodec 58.132.100 / 58.132.100
libavformat 58. 74.100 / 58. 74.100
libavdevice 58. 12.100 / 58. 12.100
libavfilter 7.109.100 / 7.109.100
libswscale 5. 8.100 / 5. 8.100
libswresample 3. 8.100 / 3. 8.100
libpostproc 55. 8.100 / 55. 8.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Multimedia Cloud Transcode (cloud.baidu.com)
Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:1 -> #0:0 (aac (native) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, s16le, to 'out.pcm':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.74.100
Stream #0:0(und): Audio: pcm_s16le, 44100 Hz, stereo, s16, 1411 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc58.132.100 pcm_s16le
size= 20860kB time=00:02:01.06 bitrate=1411.5kbits/s speed= 623x
video:0kB audio:20860kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
提取PCM産生的資料
注意:對于PCM播放時,我們要制定ar,ac,f參數
ffplay out.pcm -ac 44100 -ac 2 -f s16le
(五)濾鏡指令
主要的濾鏡操作:畫中畫 視訊的裁剪 音頻倍速 水印的添加和删除
1.擷取音視訊檔案--->進行解封裝(擷取音頻和視訊資料)--->獲得編碼過的資料包--->對資料進行解壓縮--->擷取解碼後的資料
2.擷取解碼後的資料--->對資料進行過濾--->對資料進行重新編碼
3.擷取編碼後的資料---->進行音視訊混合封裝--->輸出
ffmpeg -i gfxm.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4
-i 指定多媒體檔案
-vf 使用視訊濾鏡
crop 對視訊進行裁剪操作
in_w 輸入的視訊寬度
in_h 輸入的視訊高度
-c:v 對視訊進行編碼 格式為libx264(視訊編碼器)
-c:a 對音頻進行編碼 格式為copy,直接拷貝,不做多處理
注意:crop的參數格式為w:h:x:y, w、h為輸出視訊的寬和高, x、y标記輸入視訊中的某點,将該點作為基準點,向右下進行裁剪得到輸出視訊。 如果x y不寫的話,預設居中剪切
(六)音視訊裁剪
ffmpeg -i gfxm.mp4 -ss 00:01:00 -t 10 out.ts
-ss 視訊的開始時間 00:00:00 時:分:秒
-t 時間長度 機關s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gfxm.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Multimedia Cloud Transcode (cloud.baidu.com)
Duration: 00:02:01.11, start: 0.000000, bitrate: 746 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 864x486 [SAR 1:1 DAR 16:9], 679 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 64 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> mpeg2video (native))
Stream #0:1 -> #0:1 (aac (native) -> mp2 (native))
Press [q] to stop, [?] for help
Output #0, mpegts, to 'out.ts':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.74.100
Stream #0:0(und): Video: mpeg2video (Main), yuv420p(progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 90k tbn (default)
Metadata:
handler_name : VideoHandler
vendor_id : [0][0][0][0]
encoder : Lavc58.132.100 mpeg2video
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
Stream #0:1(und): Audio: mp2, 44100 Hz, stereo, s16, 384 kb/s (default)
Metadata:
handler_name : SoundHandler
vendor_id : [0][0][0][0]
encoder : Lavc58.132.100 mp2
frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.35 bitrate= 0.0kbits/sframe= 250 fps=172 q=31.0 Lsize= 1255kB time=00:00:09.96 bitrate=1031.3kbits/s speed=6.85x
video:684kB audio:469kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 8.798692%
裁剪指令産生的資料
-f contat 告訴ffmpeg對後面的檔案拼接
-i inputs.txt 參數是檔案(檔案内部是要合并的音視訊檔案)
注意:需要檔案片段為.ts檔案,否則不被允許合并(認為不安全)
ffmpeg -f concat -i input.txt out2.flv
(七)圖檔/視訊互轉指令
ffmpeg -i out.ts -r 1 -f image2 image-%3d.jpeg
-i 指定要輸入的多媒體檔案
-r 指定轉換圖檔的頻率 1 每秒轉出1張圖檔
-f 指定要轉出的圖檔格式 image2
image-%3d.jpeg 指定每次輸出的圖檔名稱
Input #0, mpegts, from 'out.ts':
Duration: 00:00:10.01, start: 1.429089, bitrate: 1026 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, progressive), 864x486 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 49152 vbv_delay: N/A
Stream #0:1[0x101](und): Audio: mp2 ([3][0][0][0] / 0x0003), 44100 Hz, stereo, fltp, 384 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (mpeg2video (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[swscaler @ 0x2233d00] deprecated pixel format used, make sure you did set range correctly
Output #0, image2, to 'image-%3d.jpeg':
Metadata:
encoder : Lavf58.74.100
Stream #0:0: Video: mjpeg, yuvj420p(pc, progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1 fps, 1 tbn
Metadata:
encoder : Lavc58.132.100 mjpeg
Side data:
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
frame= 9 fps=0.0 q=1.6 size=N/A time=00:00:09.00 bitrate=N/A dup=0 drop=180 sframe= 12 fps=0.0 q=1.6 Lsize=N/A time=00:00:12.00 bitrate=N/A dup=0 drop=238 speed=18.2x
video:374kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
轉換時産生的參數
ffmpeg -i image-%3d.jpeg out5.mp4 #可以通過-r指定每秒放的幀數
Input #0, image2, from 'image-%3d.jpeg':
Duration: 00:00:00.48, start: 0.000000, bitrate: N/A
Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 864x486 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 25 tbn, 25 tbc
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x150ab40] using SAR=1/1
[libx264 @ 0x150ab40] using cpu capabilities: none!
[libx264 @ 0x150ab40] profile High, level 3.1, 4:2:0, 8-bit
[libx264 @ 0x150ab40] 264 - core 161 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'out5.mp4':
Metadata:
encoder : Lavf58.74.100
Stream #0:0: Video: h264 (avc1 / 0x31637661), yuvj420p(pc, bt470bg/unknown/unknown, progressive), 864x486 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 12800 tbn
Metadata:
encoder : Lavc58.132.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame= 1 fps=0.0 q=0.0 size= 0kB time=00:00:00.00 bitrate=N/A speed=N/Aframe= 12 fps=0.0 q=-1.0 Lsize= 136kB time=00:00:00.36 bitrate=3088.8kbits/s speed=0.488x
video:135kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.725236%
[libx264 @ 0x150ab40] frame I:1 Avg QP:22.28 size: 15313
[libx264 @ 0x150ab40] frame P:8 Avg QP:24.22 size: 12224
[libx264 @ 0x150ab40] frame B:3 Avg QP:25.58 size: 8081
[libx264 @ 0x150ab40] consecutive B-frames: 50.0% 50.0% 0.0% 0.0%
[libx264 @ 0x150ab40] mb I I16..4: 42.0% 53.4% 4.6%
[libx264 @ 0x150ab40] mb P I16..4: 27.2% 43.4% 3.9% P16..4: 3.6% 0.8% 0.3% 0.0% 0.0% skip:20.9%
[libx264 @ 0x150ab40] mb B I16..4: 6.0% 15.0% 2.1% B16..8: 17.2% 5.9% 1.5% direct: 5.7% skip:46.5% L0:44.3% L1:52.4% BI: 3.3%
[libx264 @ 0x150ab40] 8x8 transform intra:58.2% inter:84.8%
[libx264 @ 0x150ab40] coded y,uvDC,uvAC intra: 49.6% 74.3% 16.7% inter: 12.2% 17.9% 2.3%
[libx264 @ 0x150ab40] i16 v,h,dc,p: 36% 44% 17% 3%
[libx264 @ 0x150ab40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 16% 22% 37% 4% 3% 3% 4% 4% 6%
[libx264 @ 0x150ab40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 29% 17% 5% 6% 6% 7% 5% 4%
[libx264 @ 0x150ab40] i8c dc,h,v,p: 35% 35% 25% 5%
[libx264 @ 0x150ab40] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x150ab40] ref P L0: 52.1% 14.7% 22.6% 10.6%
[libx264 @ 0x150ab40] ref B L0: 89.2% 10.8%
[libx264 @ 0x150ab40] kb/s:2289.13
轉換時産生的參數
(八)直播相關指令
直播推流:
-re 這個選項會将輸入的讀取速度降低到輸入的本地幀速率(即原本是音視訊同步)。它對于實時輸出(例如直播流)很有用。
-i 指定要推流出去的資料
-c 指定編碼方式(注意:是同時對音視訊處理)
-f 要推出的檔案格式
rtmp://.... 是伺服器位址 其他用戶端從伺服器中拉流
直播拉流:
-i 指定rtmp伺服器位址
-c 音視訊編碼方式
儲存為dump.flv
最全最常用的RTMP、RTSP、HTTP協定流常用直播流位址
測試拉流:
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
ffplay http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
ffmpeg -i http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8 -c copy dump.flv #拉流一段時間使用ctrl+C停止 --- 最好檔案格式一緻dump.m3u8
ffplay dump.flv
(一)常見問題---推流失敗
主要原因是時間戳問題!!!
在ffmpeg内部是按照最快的優先級,将音頻與視訊分開,用最快的方式擷取!導緻原本同步的音視訊随着FFmpeg内部機制的改變,導緻音視訊不同步。導緻出現上面的問題(比如本來應該播放音頻時,無法找到對應的音頻)
解決方法:
-re 這個選項會将輸入的讀取速度降低到輸入的本地幀速率(即是按照音視訊同步的速率播放)。它對于實時輸出(例如直播流)很有用。
(二)常見問題---清晰度不高(推流)
-f flv會将MP4音頻和視訊重新進行編碼,進行重新編碼時可能造成損失!!!造成視訊品質降低
解決方法:要麼避免不同格式的轉換,要麼使用下面方案!!
-c copy 告訴我們從一個多媒體檔案中讀取音頻和視訊時,不要進行視訊重新編碼,此時流媒體伺服器還是擷取原來的資料,是以播放的時候還是原來的音頻和視訊!!
清晰度會高,但是丢包不會避免!!