Nodejs視頻伺服器 切片ffmpeg
來自專欄 Android資料庫
第一部分 音視頻相關概念
1.1 視頻相關概念
1.1.1 解析度
解析度是用於度量圖像內數據量多少的一個參數,通常表示成ppi。通常,「解析度」被表示成每一個方向上的像素數量,比如640x480等。前者為圖片長度,後者為圖片的寬度,兩者相乘得出的是圖片的像素,長寬比一般為4:3。解析度越高,越清晰
1.1.2 比特率[碼率]
在電信和電腦運算領域,比特率(英語:Bit rate,變數R[1])是單位時間內傳輸送或處理的比特的數量。同樣解析度下,視頻文件的 碼流越大
,壓縮比就越小,畫面 質量就越高
。
壓縮同一個視頻,視頻編碼率越大,文件體積越大。視頻編碼率越大,畫質越好,馬賽克越少。
1.1.3 幀數
一幀就是一副靜止的畫面,連續的幀就形成動畫,如電視圖象等。每秒鐘播放的圖片數,單位 fps(英文:Frames Per Second),每秒的幀數或者幀率表示視頻文件或者圖形處理器場景時每秒鐘能夠更新的次數。每秒鐘幀數 (fps) 愈多,所顯示的動作就會愈流暢。
一般情況下,如果能夠保證遊戲畫面的平均FPS能夠達到30幀/秒,那麼畫面已經基本流暢;能夠達到50幀/秒,就基本可以體會到行雲流水的感覺了。一般人很難分辨出60 幀/秒與100幀/秒有什麼不同。
1.1.4 幀率、解析度、碼率的關係
摘錄自:幀率解析度碼流的關係以及DVR硬碟容量計算方法
幀率是每秒圖像的數量,解析度表示每幅圖像的尺寸即像素數量,碼流是經過視頻壓縮後每秒產生的數據量,而壓縮是去掉圖像的空間冗餘和視頻的時間冗餘,
所以- 對於靜止的場景,可以用很低的碼流獲得較好的圖像質量,
- 對於劇烈運動的場景,可能用很高的碼流也達不到好的圖像質量,所以結論是設置幀率表示您要的實時性,設置解析度是您要看的圖像尺寸大小,而碼率的設置取決於攝像機及場景的情況,通過現場調試,直到取得一個可以接受的圖像質量,就可以確定碼流大小。
1.2 ffmpeg
1.2.1 ffmpeg是什麼?
FFmpeg是一個自由軟體,可以運行音頻和視頻多種格式的錄影、轉換、流功能,包含了libavcodec——這是一個用於多個項目中音頻和視頻的解碼器庫,以及libavformat——一個音頻與視頻格式轉換庫。
「FFmpeg」這個單詞中的「FF」指的是「Fast Forward」
此計劃由幾個組件組成:
ffmpeg——一個命令行工具,用來對視頻文件轉換格式,也支持對電視卡即時編碼
ffserver——一個HTTP多媒體即時廣播流伺服器,支持時光平移
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命令行參數中文詳解,作為入門學習,摘錄相較常用的幾個試試手。
第一個需求
輸出視頻、圖片詳細信息;
採用【默認格式】導出視頻、圖片。
ffmpeg -i [視頻路徑]
沒事注意下相片、視頻
看下一個原視頻包含多少信息!!!!
$ ffmpeg -i iphone.MOV
ffmpeg version 3.3.4Copyright(c)2000-2017 the FFmpeg developers
built withApple 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 6sPlus
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 :CoreMediaDataHandler
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 :CoreMediaDataHandler
Stream#0:2(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time :2017-10-13T11:05:00.000000Z
handler_name :CoreMediaDataHandler
Stream#0:3(und): Data: none (mebx / 0x7862656D), 0 kb/s (default)
Metadata:
creation_time :2017-10-13T11:05:00.000000Z
handler_name :CoreMediaDataHandler
At least one output file must be specified
採用【默認格式】導出視頻、圖片。
默認將視頻導出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
第二個需求
----------視頻基本參數
-b:v bitrate 設置比特率,預設200kb/s(該數值依據轉發的文章,本人未驗證).
-r fps 設置幀率.預設25(該數值依據轉發的文章,本人未驗證)
-s size 設置幀大小格式為WXH 預設160X128.默認為與源相同大小.下面的簡寫也可以直接使用:Sqcif128X96 qcif 176X144 cif 252X2884cif704X576
-aspect aspect 設置橫縱比4:316:9或1.33331.7777
----------音頻基本參數
-ab bitrate 設置音頻碼率.有些版本是(-b:a bitrate)
-ar freq 設置音頻採樣率
-ac channels 設置通道預設為與輸入相同.
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
設置幀率
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
推薦閱讀:
※當機器取代人類:只有富人才能工作,無用之人將被「圈養」
※胡思亂想
※人腦開發100%會發生啥事?
※硬菜不動手(料理機+廚師機)番茄煲牛肉圓
※怎樣向朋友解釋電子墨水屏原理?