怎么做自己優(yōu)惠券網(wǎng)站天門seo
- 音視頻基礎(chǔ)
- 幀率、碼率、分辨率
- 視頻格式
- H.264和H.265視頻壓縮算法
- Moviepy
- 常見剪輯類
- VideoFlieClip
- ImageFlieClip
- ColorClip
- TextClip
- CompositeVideoClip
- AudioFlieClip
- CompositeAudioClip
- 常見操作
- 音視頻的讀入與導(dǎo)出
- 截取音視頻
音視頻基礎(chǔ)
幀率、碼率、分辨率
-
體積(Volume):一個視頻的容量(文件大小),單位是B(byte)。碼率影響體積,與體積成正比。如果碼率為變量,則幀率也會影響體積,幀率越高,每秒鐘經(jīng)過的畫面越多,需要的碼率也越高,體積也越大。
-
幀率(FPS):每秒鐘要多少幀畫面,就是在1秒鐘時間里傳輸?shù)膱D片的幀數(shù)。影響畫面流暢度,與畫面流暢度成正比。幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。如我們看b站常見的
1080P 60幀
,其中60幀就是幀率,表示每秒播放60張圖片。 -
碼率(Bitrate):編碼器每秒傳輸?shù)臄?shù)據(jù)大小(帶寬),單位是kbps 即千位每秒,比如800kbps代表編碼器每秒產(chǎn)生800kb(或100KB)的數(shù)據(jù)。如b站要求up主上傳的視頻碼率最高為6000kbps(H264/AVC編碼)。
-
分辨率(Resolution):單位英寸中所包含的橫縱向像素點(diǎn)數(shù)(圖像寬高); VGA:Video Graphics Array(視頻圖像分辨率)。影響圖像大小,與圖像大小成正比:分辨率越高,圖像越大;分辨率越低,圖像越小。在碼率一定的情況下,分辨率與清晰度成反比關(guān)系:分辨率越高,圖像越不清晰,分辨率越低,圖像越清晰。如我們看b站常見的最大分辨率
1080P
,其中1080P就是分辨率,P表示(Progressive scanning,逐行掃描)。以我們常見的16:9的屏幕舉例(注意,一定要強(qiáng)調(diào)屏幕的寬高比例),1080表示1920 * 1080
個像素(其實我們可以說,1080P每一行有接近1K的像素點(diǎn)),2K則是2560 * 1440
,4K則是3840 * 2160
。
好的畫質(zhì)是分辨率、幀率和碼率三者之間的平衡:
碼率不是越大越好,如果不做碼率大小上的限制,那么分辨率越高,畫質(zhì)越細(xì)膩;幀率越高,視頻也越流暢,但相應(yīng)的碼率也會很大,因為每秒鐘需要用更多的數(shù)據(jù)來承載較高的清晰度和流暢度。
如果限定一個碼率,比如800kbps,那么幀率越高,編碼器就必須加大對單幀畫面的壓縮比,也就是通過降低畫質(zhì)來承載足夠多的幀數(shù)。
視頻格式
一個音視頻文件實際上分為3層:基礎(chǔ)數(shù)據(jù),編碼,封裝。
編碼
使用不同的編碼格式
,對視頻數(shù)據(jù)進(jìn)行壓縮;封裝
使用不同的封裝格式
,將視頻數(shù)據(jù)封裝成不同的文件。
-
封裝格式:封裝格式只是視頻的一層皮,只是對 文件信息 和 壓縮好的音視頻數(shù)據(jù),按照一定的規(guī)則進(jìn)行編排,不限制視頻數(shù)據(jù)的幀率、分辨率、碼率等參數(shù),因此封裝格式不會影響視頻的清晰度。如MP4(兼容性強(qiáng))、FLV(在線播放nb)、HLS(長視頻nb)、AVI、MKV(支持外接字幕)、PCM、ACC、MOV等。
-
編碼格式:編碼格式才是音視頻流編碼的內(nèi)在組織形式,對原始的音視頻數(shù)據(jù)進(jìn)行壓縮。如H.264、H.265等。
H.264和H.265視頻壓縮算法
H.264,同時也是MPEG-4的第十部分,被稱作,是由聯(lián)合視頻組(JVT,Joint Video Team)提出的視頻編解碼器標(biāo)準(zhǔn)(視頻壓縮/編碼算法)。這個標(biāo)準(zhǔn)通常被稱之為H.264/AVC
(或者AVC/H.264
或者H.264/MPEG-4AVC
或MPEG-4/H.264 AVC
),其中AVC(Advanced Video Coding,高級視頻編碼)。H.264主要包含:宏塊細(xì)分圖像、幀內(nèi)壓縮(intra compress)減少空間冗余、幀間預(yù)測(inter prediction)減少時間冗余、轉(zhuǎn)換(transform) 和 量化(quantization)進(jìn)行殘留數(shù)據(jù)壓縮、去區(qū)塊濾波器(deblocking filter)、熵編碼(entropy coding) 等模塊。
H.265,通常被稱為 H.265/HEVC
,兩者都是基于塊的視頻編碼技術(shù),H.265的編碼架構(gòu)大致上和H.264的架構(gòu)相似,但編碼的文件大小會比H.264小50%,相同畫質(zhì)下更加節(jié)省帶寬/流量。也主要包含:宏塊細(xì)分圖像、幀內(nèi)壓縮(intra compress)減少空間冗余、幀間預(yù)測(inter prediction)減少時間冗余、轉(zhuǎn)換(transform) 和 量化(quantization)進(jìn)行殘留數(shù)據(jù)壓縮、去區(qū)塊濾波器(deblocking filter)、熵編碼(entropy coding) 等模塊。但在HEVC編碼架構(gòu)中,整體被分為了三個基本單位,分別是:編碼單位(coding unit,CU)
、預(yù)測單位(predict unit,PU)
和轉(zhuǎn)換單位(transform unit,TU)
。
-
宏塊劃分:把圖像劃分成一個一個的小像素塊(patch)。
-
幀內(nèi)壓縮(intra compress):類似JPEG這種有損壓縮,減少空間冗余。
-
幀間預(yù)測(inter prediction):根據(jù)關(guān)鍵幀和運(yùn)動變化的信息,預(yù)測出中間幀,減少時間冗余。把幀分為:I幀(關(guān)鍵幀)、P幀(根據(jù)前一個I或P幀預(yù)測出來的幀)、B幀(根據(jù)前后兩個I或P幀預(yù)測出來的幀)。
I幀(關(guān)鍵幀)預(yù)測 P幀(下一幀):對于沒有變化的宏塊,P幀直接復(fù)制I幀。對于變化的宏塊,編碼的時候,記錄變化的信息
,解碼的時候,再預(yù)測回去。
B幀(雙向預(yù)測幀):利用前后兩幀來預(yù)測出的幀。
GPO的概念:I幀的間隔長度。錄播視頻GOP一般為幀率的4-5倍,直播視頻GOP一般為幀率的1-2倍。如果太大,I幀間隔太遠(yuǎn),會產(chǎn)生花屏問題,P幀和B幀預(yù)測不到位。
-
H264的編解碼性能要求更低,更加普及;如H264由于算法優(yōu)化,可以低于1Mbps的速度(碼率)實現(xiàn)標(biāo)清數(shù)字圖像傳送;
-
H265的壓縮率更,因此帶寬和容量的要求更低,但對編解碼性能要求更高。如H265則可以實現(xiàn)利用1~2Mbps的傳輸速度(碼率)傳送720P(分辨率1280*720)普通高清音視頻傳送。
Moviepy
Moviepy 和 python-ffmpeg 和 用subprocess調(diào)用ffmpeg 有相同的效果,都可以實現(xiàn):視頻剪輯,視頻拼接,插入標(biāo)題、字幕水印,視頻合成,自定義的高級的音視頻特效等。此外,MoviePy 可以讀寫絕大多數(shù)常見的視頻格式,甚至包括 GIF 格式!
MoviePy 使用軟件 FFmpeg 讀取和導(dǎo)出視頻和音頻文件,使用 ImageMagick 生產(chǎn)文字和 GIF 圖。中間的處理過程賴于 Python 強(qiáng)大的數(shù)學(xué)處理庫,高級特效和軟件加強(qiáng)用到了許多的 Python 圖像處理庫。
- FFmpeg的優(yōu)點(diǎn)是速度快,缺點(diǎn)則是命令復(fù)雜。
- Moviepy開發(fā)起來更加簡便,缺點(diǎn)就是相當(dāng)于ffmpeg速度更慢一些,且不支持stream video流媒體(如直播/攝像頭)!
常見剪輯類
Clip
是所有剪輯類的基類,VideoClip
和AudioClip
繼承自Clip,分別處理視頻和音頻數(shù)據(jù)。VideoClip
和AudioClip
又有很多派生類,用于處理 不同的視頻和音頻內(nèi)容。所有的類都可以從Moviepy.editor
模塊導(dǎo)入。Clip、VideoClip、AudioClip三個基類是非常少用的,我們接下來著重介紹他們的派生類。
其中最核心的是VideoClip類的對象 clips(視頻片段)
,開發(fā)者可以對 clips 進(jìn)行修改(剪切,調(diào)速度,調(diào)亮度…)或者和其他 clip 混合拼接到一起。vedio clip 可以由視頻文件,圖像,文本或者動畫來創(chuàng)建實例。vedio clip 可以擁有一個音頻軌道(audio clip) 和一個疊加層的 vedio clip(這是一個特殊的 VedioClip,這意味著,當(dāng)一個視頻和其他 VedioClip 混合的時候,這個疊加層 clip 是隱藏的)
VideoFlieClip
ImageFlieClip
ColorClip
TextClip
CompositeVideoClip
AudioFlieClip
CompositeAudioClip
常見操作
https://www.bilibili.com/video/BV1Qp421d7yz/?spm_id_from=333.788&vd_source=b2549fdee562c700f2b1f3f49065201b
https://xie.infoq.cn/article/23e694841b8526b2ba9d5fb7c
音視頻的讀入與導(dǎo)出
讀入視頻,導(dǎo)出視頻:write_videofile
# 導(dǎo)入需要的庫
from moviepy.editor import *# 從本地載入視頻myHolidays.mp4,并截取00:00:50 - 00:00:60部分
clip = VideoFileClip("Mojito.mp4").subclip(50,60)# 調(diào)低音頻音量 (volume x 0.8)
clip = clip.volumex(0.8)
# 做一個txt clip. 自定義樣式,顏色.
txt_clip = TextClip("Mojito by Jay",fontsize=70,color='white')
# 文本clip在屏幕正中顯示持續(xù)10秒
txt_clip = txt_clip.set_pos('center').set_duration(10)
# 把 text clip 的內(nèi)容覆蓋 video clip
video = CompositeVideoClip([clip, txt_clip])# 把最后生成的視頻導(dǎo)出到文件內(nèi)
video.write_videofile("Mojito_edited.mp4") # 默認(rèn)編解碼器codec="libx264"
video.write_videofile("Mojito_edited.mp4", codec="mpeg4") # MP4也可以指定編解碼器為"mpeg4"
video.write_videofile("Mojito_edited.avi", codec="rawvideo")
video.write_videofile("Mojito_edited.webm") # 默認(rèn)編解碼器codec="libx264"
video.write_videofile("Mojito_edited.flv", codec="flv")
讀入音頻,導(dǎo)出音頻:write_audiofile
# 導(dǎo)入需要的庫
from moviepy.editor import *
# 從本地載入視頻myHolidays.mp4,并截取00:00:50 - 00:00:60部分
clip = VideoFileClip("/data3/yzr/Mojito.mp4").subclip(3,10)# 取clip的audio音頻部分
audio = clip.audio# 保存為MP3
audio.write_audiofile("Mojito.mp3")
# 保存為wav
audio.write_audiofile("Mojito.wav", codec="pcm_s32le")
# 保存為wmav1
audio.write_audiofile("Mojito.wam", codec="wam1")
導(dǎo)出GIF動圖:write_gif
# 導(dǎo)入需要的庫
from moviepy.editor import *# 從本地載入視頻myHolidays.mp4,并截取00:00:50 - 00:00:60部分
clip = VideoFileClip("/data3/yzr/Mojito.mp4").subclip(3,10)# 把最后生成的視頻導(dǎo)出到文件內(nèi)
clip.write_gif("Mojito_edited.gif")
導(dǎo)出視頻截圖:save_frame
# 導(dǎo)入需要的庫
from moviepy.editor import *# 從本地載入視頻myHolidays.mp4,并截取00:00:50 - 00:00:60部分
clip = VideoFileClip("/data3/yzr/Mojito.mp4").subclip(3,10)# 保存clip起始幀
clip.save_frame("frame.png")
# 保存視頻第10秒截圖
clip.save_frame("frame.png", t=10)