seo網(wǎng)站開發(fā)注意事項(xiàng)鄭州整站網(wǎng)站優(yōu)化
本文闡述的均為命令行的使用方式,并不牽扯FFmpeg 的 C++音視頻開發(fā)內(nèi)容,補(bǔ)充一句,C++的資料真的少,能把C++學(xué)好的人,我真的是覺得巨佬。
我主要是使用FFmpeg 推流方面的知識(shí),案例大都是靠近這方面。
一、FFmpeg 介紹
本文讀者會(huì)比較小眾~ 看到此文的朋友,大概率是需要用到FFmpeg啦,簡(jiǎn)單說一下下。
就算是從來沒接觸過的朋友,其實(shí)也已經(jīng)在生活的各個(gè)方面都接觸過FFmpeg處理完?yáng)|西(音視頻)。
一句話來總結(jié):FFmpeg 就是一款封裝好的關(guān)于音視頻方面的開源處理工具。
它功能強(qiáng)大,用途廣泛,大量用于視頻網(wǎng)站和商業(yè)軟件(比如 Youtube 和 iTunes),也是許多音頻和視頻格式的標(biāo)準(zhǔn)編碼/解碼實(shí)現(xiàn)。
如果有接觸過 gstreamer (另外一個(gè)音視頻處理框架),它的也有使用到 FFmpeg 的編碼器。
二、FFmpeg 安裝
sudo apt-get install ffmpeg
ffmpeg --help
安裝就一會(huì)的事情,主要還是要看怎么使用。
三、FFmpeg 使用
FFmpeg 的命令行參數(shù)分布大致如下:
ffmpeg \
[全局參數(shù)] \
[輸入文件參數(shù)] \
-i [輸入文件] \
[輸出文件參數(shù)] \
[輸出文件]
下面是一個(gè)例子。
ffmpeg \
-y \ # 全局參數(shù)
-c:a libfdk_aac -c:v libx264 \ # 輸入文件參數(shù)
-i input.mp4 \ # 輸入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 輸出文件參數(shù)
output.avi # 輸出文件
上面的命令將 mp4 文件轉(zhuǎn)成 webm 文件,這兩個(gè)都是容器格式。輸入的 mp4 文件的音頻編碼格式是 aac,視頻編碼格式是 H.264;輸出的 webm 文件的視頻編碼格式是 VP9,音頻格式是 Vorbis。
如果不指明編碼格式,FFmpeg 會(huì)自己判斷輸入文件的編碼。因此,上面的命令可以簡(jiǎn)單寫成下面的樣子。
?
ffmpeg -i input.avi output.mp4
相關(guān)學(xué)習(xí)資料推薦,點(diǎn)擊下方鏈接免費(fèi)報(bào)名,先碼住不迷路~】
免費(fèi)學(xué)習(xí)地址:https://xxetb.xet.tech/s/2cGd0
【免費(fèi)分享】音視頻學(xué)習(xí)資料包、大廠面試題、技術(shù)視頻和學(xué)習(xí)路線圖,資料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以點(diǎn)擊788280672加群免費(fèi)領(lǐng)取~
四、FFmpeg 常見案例
本章節(jié)只是簡(jiǎn)單的介紹了如何使用,并且解釋啦常用的參數(shù),如果需要更詳細(xì)全面的參數(shù)解釋,可以查看FFmpeg官方文檔。
封包格式(format、視頻格式)、編碼、解碼、幀率、I幀、B幀等等一些偏向于專業(yè)的名詞,大伙如果有需求可以去仔細(xì)了解了解,我這邊暫時(shí)只是簡(jiǎn)單使用一下。
4.1、轉(zhuǎn)換編碼格式
轉(zhuǎn)換編碼格式(transcoding)指的是, 將視頻文件從一種編碼轉(zhuǎn)成另一種編碼。比如轉(zhuǎn)成 H.264 編碼,一般使用編碼器libx264
,所以只需指定輸出文件的視頻編碼器即可。
?
ffmpeg -i 1.mp4 -c:v libx264 output_h264.mp4
查看支持的編碼器(也就是?-vcodec
?簡(jiǎn)稱為?-c:v
?后面可以接的參數(shù)):
ffmpeg -codecs
支持很多很多,不一一列舉出來啦
4.2、轉(zhuǎn)換文件格式:
ffmpeg -y -i 1.mp4 -c:v libx264 -preset ultrafast -b:v 6000k output_avi.avi其中,
:v 代表視頻,:a 代表音頻;
- -i 1.mp4 表示視頻輸入來源,這表示當(dāng)前目錄下的 1.mp4 ,也可以接收來自外部視頻源或者本機(jī)攝像頭作為視頻來源
- -c:v libx264 表示使用264編碼器,
- -preset,H.264 的轉(zhuǎn)碼預(yù)設(shè)參數(shù)和調(diào)優(yōu)參數(shù)。指定輸出的視頻質(zhì)量,會(huì)影響文件的生成速度,有以下幾個(gè)可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
- -b 6000k 指定碼率(比特率),碼率低時(shí)速度快,但失真嚴(yán)重,碼率高時(shí)反之;
- -y 表示如果已存在?
output_avi.avi
則將其覆蓋;
4.3、對(duì)已有視頻進(jìn)行抓圖:
?
ffmpeg -i output_avi.avi -y -f image2 -ss 8 -t 0.001 -s 1980x1280 'test.jpg'
4.4 調(diào)整碼率
調(diào)整碼率(transrating)指的是,改變編碼的比特率,一般用來將視頻文件的體積變小。下面的例子指定碼率最小為964K,最大為3856K,緩沖區(qū)大小為 2000K。
ffmpeg -i 1.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output_rate.mp4
4.5 改變分辨率(transsizing)
下面是改變視頻分辨率(transsizing)的例子,從 1080p 轉(zhuǎn)為 480p
ffmpeg -y -i 1.mp4 -vf scale=480:-1 output_scale.mp4
4.6 提取音頻
有時(shí),需要從視頻里面提取音頻(demuxing),可以像下面這樣寫。
ffmpeg -y -i 1.mp4 -vn -c:a copy output_avideo.aac
上面例子中,-vn
表示去掉視頻,-c:a copy
表示不改變音頻編碼,直接拷貝。
4.7、本地?cái)z像頭推流
ffmpeg -f video4linux2 -r 30 -i /dev/video0 -vcodec h264 -f flv rtmp://192.168.79.133:1935/live/stream0
稍微解釋一下上面的命令:
-f video4linux2 -r 30 -i /dev/video0
?表示從 /dev/video0 中以 30 fps 的幀率采集視頻,視頻格式 為 video4linux2c:v libx264
?輸出視頻的編碼格式是 H.264, RTMP 通常采用H.264 編碼f flv
?指的視頻的封包格式, RTMP 一般采用 flv 封包格式。an
?忽略音頻流preset superfast -tune zerolatency
?H.264 的轉(zhuǎn)碼預(yù)設(shè)參數(shù)和調(diào)優(yōu)參數(shù)。會(huì)影響視頻質(zhì)量和壓縮率
注意:在虛擬機(jī)中使用攝像頭需注意、將USB的兼容性設(shè)置成USB3.0 ,否則出現(xiàn)推流一直卡在那
五、Docker 安裝流媒體服務(wù)器,推流和拉流實(shí)現(xiàn)
這里我當(dāng)時(shí)就是隨便在github上找了一個(gè)可以docker方式部署的流媒體服務(wù)器~
直接輸入下面這條命令就可以構(gòu)建成功啦。
sudo docker run -id --restart=always -p 1935:1935 -p 8080:80 -p 8443:443 -p 554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp zlmediakit/zlmediakit:master
zlmediakit:
github 地址
詳細(xì)使用大家可以去到github仔細(xì)閱讀文檔,我只是簡(jiǎn)單使用,不再多說啦哈
FFmpeg 推流和拉流測(cè)試
推流和拉流,要是接觸過視頻服務(wù)可能就比較了解~
粗糙的流程就大致如上圖啦,推流就是將收集到的視頻流推送到流媒體服務(wù)器上去,拉流就是從流媒體服務(wù)器上把視頻拉取下來,進(jìn)行播放。
至于如何收集視頻,如何進(jìn)行視頻處理,更為詳細(xì)的就沒有介紹啦,FFmpeg 是涵蓋了全流程的, 可以去了解了解。
里面牽扯到的 RTSP、RTMP、HTTP-FLV協(xié)議,都是一些視頻相關(guān)的協(xié)議,可以去了解了解,我這里只測(cè)試了 RTSP和RTMP協(xié)議。
rtsp 推流和拉流
ffmpeg -re -i 1.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.79.133/live/room
(rtsp 端口我這里使用的是默認(rèn)的 554,故而省略沒寫啦
拉流進(jìn)行播放可以使用專門的播放器,也可以使用ffmpeg的組件ffplay來進(jìn)行視頻的播放
ffplay 拉流進(jìn)行播放
ffplay rtsp://192.168.79.133:554/live/room
常用的播放器 vlc media player 也可以播放 rtsp 和 rtmp 協(xié)議的視頻流。
播放器截圖
然后正常播放就是ok啦
rtmp 推流
ffmpeg -re -i 1.mp4 -vcodec h264 -acodec aac -f flv rtmp://192.168.79.133/live/roomffplay rtmp://192.168.79.133:1935/live/room
rtmp協(xié)議的端口號(hào)是 1935 ~這些端口號(hào),都是可以修改的,是否支持取決于你部署的流媒體服務(wù)器是什么樣的。
播放器截圖
(另外,這個(gè)流媒體服務(wù)器內(nèi)部對(duì)視頻做了處理,可以實(shí)現(xiàn)多種輸出,你RTMP推上去的,也可以用RTSP協(xié)議拉流下來的)
原文?FFmpeg 的使用與Docker安裝流媒體服務(wù)器