node 視頻服務(wù)器 切片ffmpeg
第一部分 音視頻相關(guān)概念
1.1 視頻相關(guān)概念
1.1.1 分辨率
分辨率是用于度量圖像內(nèi)數(shù)據(jù)量多少的一個參數(shù)丹擎,通常表示成ppi。通常兼贡,“分辨率”被表示成每一個方向上的像素數(shù)量,比如640x480等岳遥。前者為圖片長度已旧,后者為圖片的寬度,兩者相乘得出的是圖片的像素撒妈,長寬比一般為4:3恢暖。
分辨率越高,越清晰
1.1.2 比特率[碼率]
在電信和電腦運算領(lǐng)域狰右,比特率(英語:Bit rate杰捂,變量R[1])是單位時間內(nèi)傳輸送或處理的比特的數(shù)量。同樣分辨率下棋蚌,視頻文件的碼流越大
嫁佳,壓縮比就越小,畫面質(zhì)量就越高
谷暮。
壓縮同一個視頻蒿往,視頻編碼率越大,文件體積越大湿弦。視頻編碼率越大瓤漏,畫質(zhì)越好,馬賽克越少颊埃。
1.1.3 幀數(shù)
一幀就是一副靜止的畫面蔬充,連續(xù)的幀就形成動畫,如電視圖象等班利。每秒鐘播放的圖片數(shù)饥漫,單位 fps(英文:Frames Per Second),每秒的幀數(shù)或者幀率表示視頻文件或者圖形處理器場景時每秒鐘能夠更新的次數(shù)罗标。每秒鐘幀數(shù) (fps) 愈多庸队,所顯示的動作就會愈流暢。
一般情況下馒稍,如果能夠保證游戲畫面的平均FPS能夠達到30幀/秒皿哨,那么畫面已經(jīng)基本流暢;能夠達到50幀/秒纽谒,就基本可以體會到行云流水的感覺了证膨。一般人很難分辨出60 幀/秒與100幀/秒有什么不同。
1.1.4 幀率鼓黔、分辨率央勒、碼率的關(guān)系
摘錄自:幀率分辨率碼流的關(guān)系以及DVR硬盤容量計算方法
幀率是每秒圖像的數(shù)量,分辨率表示每幅圖像的尺寸即像素數(shù)量澳化,碼流是經(jīng)過視頻壓縮后每秒產(chǎn)生的數(shù)據(jù)量崔步,而壓縮是去掉圖像的空間冗余和視頻的時間冗余,
所以
- 對于靜止的場景缎谷,可以用很低的碼流獲得較好的圖像質(zhì)量井濒,
- 對于劇烈運動的場景,可能用很高的碼流也達不到好的圖像質(zhì)量,所以結(jié)論是設(shè)置幀率表示您要的實時性瑞你,設(shè)置分辨率是您要看的圖像尺寸大小酪惭,而碼率的設(shè)置取決于攝像機及場景的情況,通過現(xiàn)場調(diào)試者甲,直到取得一個可以接受的圖像質(zhì)量春感,就可以確定碼流大小。
1.2 ffmpeg
1.2.1 ffmpeg是什么虏缸?
FFmpeg是一個自由軟件鲫懒,可以運行音頻和視頻多種格式的錄影、轉(zhuǎn)換刽辙、流功能窥岩,包含了libavcodec——這是一個用于多個項目中音頻和視頻的解碼器庫,以及l(fā)ibavformat——一個音頻與視頻格式轉(zhuǎn)換庫扫倡。
“FFmpeg”這個單詞中的“FF”指的是“Fast Forward”
此計劃由幾個組件組成:
ffmpeg——一個命令行工具谦秧,用來對視頻文件轉(zhuǎn)換格式,也支持對電視卡即時編碼
ffserver——一個HTTP多媒體即時廣播流服務(wù)器撵溃,支持時光平移
ffplay——一個簡單的播放器疚鲤,基于SDL與FFmpeg庫
libavcodec——包含全部FFmpeg音頻/視頻編解碼庫
libavformat——包含demuxers和muxer庫
libavutil——包含一些工具庫
libpostproc——對于視頻做前處理的庫
libswscale——對于視頻作縮放的庫
1.2.2 ffmpeg配置
以Mac為例,采用Homebrew下載ffmpeg; 步驟簡單缘挑,就帶過了集歇。
brew info ffmpeg
brew install ffmpeg
1.2.3 ffmpeg常用的命令
這個博客寫的太詳細了ffmpeg命令行參數(shù)中文詳解,作為入門學(xué)習(xí),摘錄相較常用的幾個試試手语淘。
第一個需求
1. 輸出視頻诲宇、圖片詳細信息;
2. 采用【默認格式】導(dǎo)出視頻惶翻、圖片姑蓝。
ffmpeg -i [視頻路徑]
沒事注意下相片、視頻
看下一個原視頻包含多少信息B来帧7挠!颅筋!
$ ffmpeg -i iphone.MOV
ffmpeg version 3.3.4 Copyright (c) 2000-2017 the FFmpeg developers
built with Apple LLVM version 8.1.0 (clang-802.0.42)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --enable-videotoolbox --disable-lzma --enable-vda
libavutil 55. 58.100 / 55. 58.100
libavcodec 57. 89.100 / 57. 89.100
libavformat 57. 71.100 / 57. 71.100
libavdevice 57. 6.100 / 57. 6.100
libavfilter 6. 82.100 / 6. 82.100
libavresample 3. 5. 0 / 3. 5. 0
libswscale 4. 6.100 / 4. 6.100
libswresample 2. 7.100 / 2. 7.100
libpostproc 54. 5.100 / 54. 5.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'iphone.MOV':
-----------手機信息----------------
Metadata:
major_brand : qt
minor_version : 0
compatible_brands: qt
creation_time : 2017-10-13T11:05:00.000000Z
-----------地理位置-已暴露位置宙暇。。议泵。-------------
com.apple.quicktime.location.ISO6709: +31.2388+121.4454+014.240/
com.apple.quicktime.make: Apple
com.apple.quicktime.model: iPhone 6s Plus
com.apple.quicktime.software: 11.0.3
com.apple.quicktime.creationdate: 2017-10-13T19:04:59+0800
---------------------------
#-----時長03.10----6.1 MB
#-----bitrate:15642 kb/s
#-----分辨率: 1920x1080
#-----29.98 fps
#-----H.264
Duration: 00:00:03.10, start: 0.000000, bitrate: 15642 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080, 15528 kb/s, 29.98 fps, 29.97 tbr, 600 tbn, 1200 tbc (default)
Metadata:
rotate : 90
creation_time : 2017-10-13T11:05:00.000000Z
handler_name : Core Media Data Handler
encoder : H.264
Side data:
displaymatrix: rotation of -90.00 degrees
#----- 音頻編碼:Audio: aac
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 93 kb/s (default)
Metadata:
creation_time : 2017-10-13T11:05:00.000000Z
handler_name : Core Media Data Handler
Stream #0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time : 2017-10-13T11:05:00.000000Z
handler_name : Core Media Data Handler
Stream #0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time : 2017-10-13T11:05:00.000000Z
handler_name : Core Media Data Handler
At least one output file must be specified
采用【默認格式】導(dǎo)出視頻占贫、圖片。
默認將視頻導(dǎo)出out.mp4
$ ffmpeg -i iphone.mp4 out.mp4
.....
$ ffmpeg -i iphone.MOV
先口。型奥。瞳收。。
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'out.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf57.71.100
---------------------------
#-----時長03.10----6.1 MB ---> 003.14----2 MB
#-----bitrate:15642 kb/s --> 5228 kb/s
#-----分辨率: 1920x1080 ->1920x1080
#-----29.98 fps -> 29.97 fps
#-----H.264
Duration: 00:00:03.14, start: 0.000000, bitrate: 5228 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1080x1920, 5198 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 71 kb/s (default)
Metadata:
handler_name : SoundHandler
At least one output file must be specified
第二個需求
----------視頻基本參數(shù)
-b:v bitrate 設(shè)置比特率, 缺省200kb/s(該數(shù)值依據(jù)轉(zhuǎn)發(fā)的文章, 本人未驗證).
-r fps 設(shè)置幀率. 缺省25(該數(shù)值依據(jù)轉(zhuǎn)發(fā)的文章, 本人未驗證)
-s size 設(shè)置幀大小 格式為WXH 缺省160X128. 默認為與源相同大小. 下面的簡寫也可以直接使用: Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777
----------音頻基本參數(shù)
-ab bitrate 設(shè)置音頻碼率. 有些版本是(-b:a bitrate)
-ar freq 設(shè)置音頻采樣率
-ac channels 設(shè)置通道 缺省為與輸入相同.
-an 不使能音頻紀(jì)錄
-acodec codec 使用codec編解碼
設(shè)置幀率
ffmpeg -i test2.mp4 -codec:v libx264 -codec:a mp3 -map 0 -f ssegment -segment_format mpegts -segment_list playlist.m3u8 -segment_time 5 out%03d.ts
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls output.m3u8
time ffmpeg -i test2.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 output.m3u8
#時間
time ffmpeg -i test2.mp4 -strict -2 -f hls -hls_list_size 0 -hls_time 5 output.m3u8
參考
音視頻相關(guān)參數(shù)總結(jié)
ffmpeg 入門
幀率分辨率碼流的關(guān)系以及DVR硬盤容量計算方法
ffmpeg支持多核操作
在子進程中操作
FFmpeg源代碼簡單分析:avcodec_open2()