這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Serverless中怎么實現(xiàn)視頻壓縮與格式轉(zhuǎn)換,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
桐廬網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
在百科上可以看到這樣的描述:
FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計算機(jī)程序。采用LGPL或GPL許可證。它提供了錄制、轉(zhuǎn)換以及流化音視頻的完整解決方案。它包含了非常先進(jìn)的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質(zhì)量,libavcodec里很多code都是從頭開發(fā)的。 FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運(yùn)行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發(fā)起,2004年至2015年間由Michael Niedermayer主要負(fù)責(zé)維護(hù)。許多FFmpeg的開發(fā)人員都來自MPlayer項目,而且當(dāng)前FFmpeg也是放在MPlayer項目組的服務(wù)器上。項目的名稱來自MPEG視頻編碼標(biāo)準(zhǔn),前面的"FF"代表"Fast Forward"。
而在實際生產(chǎn)生活中,ffmpeg確實也是一個非常好的工具,我們可以通過這個工具來進(jìn)行圖像的壓縮/轉(zhuǎn)碼等操作。
通過ffmpeg的官網(wǎng),我們可以看到不同的操作系統(tǒng),有著不同的文件供我們選擇:
也就是說,我們?nèi)绻谠坪瘮?shù)中使用這個模塊,那么我們就要有這樣一個模塊是在云函數(shù)所在的環(huán)境下可以運(yùn)行起來的,根據(jù)云函數(shù)的文檔可以看到:
也就是說,我們要有一個在CentOS操作系統(tǒng)下可以使用的ffmpeg,接下來,我們就準(zhǔn)備這個文件:
在CentOS操作系統(tǒng)上,下載源碼包:wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz
解壓并進(jìn)入目錄:tar -zxvf ffmpeg-3.1.tar.gz && cd ffmpeg-3.1
編譯安裝: ./configure && make && make install
在進(jìn)行./configure
操作的時候,可能出現(xiàn)yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild
錯誤。
yasm是匯編編譯器,ffmpeg為了提高效率使用了匯編指令,如MMX和SSE等。所以系統(tǒng)中未安裝yasm時,就會報錯誤,此時可以安裝yasm編譯器來解決:
下載wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
解壓并進(jìn)入目錄:tar zxvf yasm-1.3.0.tar.gz && cd yasm-1.3.0
編譯安裝:./configure && make && make install
完成ffmpeg的編譯安裝,可以在當(dāng)前目錄下看到生成了文件:ffmpeg
此時我們保存這個文件即可在騰訊云的云函數(shù)中使用。
按照騰訊云提供的時間架構(gòu)圖,我們可以看到其推薦的是對象存儲觸發(fā)器觸發(fā)函數(shù),也就是說我們將視頻存儲到對象存儲中,然后通過對象存儲的相關(guān)觸發(fā)器觸發(fā)函數(shù),進(jìn)行視頻的處理,處理之后再回傳對象存儲的操作。
代碼實現(xiàn):
import os import subprocess from qcloud_cos_v5 import CosConfig from qcloud_cos_v5 import CosS3Client secret_id = os.environ.get('secret_id') secret_key = os.environ.get('secret_key') region = os.environ.get('region') cosClient = CosS3Client(CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key)) # 移動ffmpeg到tmp目錄,并且賦予權(quán)限 with open("./ffmpeg", "rb") as rf: with open("/tmp/ffmpeg", "wb") as wf: wf.write(rf.read()) subprocess.run('chmod 755 /tmp/ffmpeg', shell=True) def main_handler(event, context): for record in event['Records']: bucket = record['cos']['cosBucket']['name'] + '-' + record['cos']['cosBucket']['appid'] key = "/".join(record['cos']['cosObject']['key'].split("/")[3:]) download_path = '/tmp/{}'.format(key.split('/')[-1]) upload_path = '/tmp/new_mp4-{}'.format(key.split('/')[-1]) # 下載圖片 print("key", key) response = cosClient.get_object(Bucket=bucket, Key=key) response['Body'].get_stream_to_file(download_path) # 執(zhí)行ffmpeg指令壓縮視頻 child = subprocess.run('/tmp/ffmpeg -i %s -r 10 -b:a 32k %s'%(download_path, upload_path), stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, shell=True) # 上傳圖片 cosClient.put_object_from_local_file( Bucket=bucket, LocalFilePath=upload_path, Key="/new_mp4/" + key.split('/')[-1] )
這里的主要操作就是在容器建立的時候,或者說是函數(shù)冷啟動的時候,將ffmpeg復(fù)制到可執(zhí)行目錄,并且設(shè)置其權(quán)限為755
。
完成之后可以進(jìn)行serverless.yaml
的編寫:
MyVideo: component: "@serverless/tencent-scf" inputs: name: MyVideo codeUri: ./ handler: index.main_handler runtime: Python3.6 region: ap-guangzhou memorySize: 128 timeout: 200 environment: variables: secret_id: 用戶密鑰id secret_key: 用戶密鑰key region: ap-guangzhou events: - cos: name: video-1256773370.cos.ap-guangzhou.myqcloud.com parameters: bucket: video-1256773370.cos.ap-guangzhou.myqcloud.com filter: prefix: source/ events: cos:ObjectCreated:* enable: true
部署完成之后,我們將一個測試的MP4文件上傳到對應(yīng)的存儲的source/
文件夾中:
稍等片刻,我們可以看到目標(biāo)文件夾出現(xiàn)了對應(yīng)的視頻:
可以看到兩個視頻文件的差距。
當(dāng)然,這里僅僅是通過/tmp/ffmpeg -i 原視頻 -r 10 -b:a 32k 生成視頻
來進(jìn)行視頻壓縮,除此之外,我們還可以使用ffmpeg進(jìn)行額外的操作(以下內(nèi)容來源于canmeng的博客):
ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vcodec copy -acodec copy output.mp4
-ss 指定從什么時間開始
-t 指定需要截取多長時間
-i 指定輸入文件
這個命令就是從00秒開始裁剪到00+30=30秒結(jié)束,總共30秒的視頻。這個命令執(zhí)行很快,因為只是原始數(shù)據(jù)的拷貝,中間沒有什么編碼和解碼的過程。執(zhí)行這個命令后你能得到output.mp4這個輸出文件。你可以用視頻播放軟件播放這個視頻看看。
可能有些視頻裁剪后的效果,如期望一致,00秒開始,30秒結(jié)束,總共30秒的視頻,但是有些視頻裁剪后你會發(fā)現(xiàn)可能開始和結(jié)束都不是很準(zhǔn)確,有可能是從00秒開始,33秒結(jié)束。這是為什么呢?
因為這些視頻里30秒處地方剛好不是關(guān)鍵幀,而ffmpeg會在你輸入的時間點附近圓整到最接近的關(guān)鍵幀處,然后做接下來的事情。如果你不懂什么是關(guān)鍵幀,沒關(guān)系,這也不影響你使用這個命令。
合并視頻
//截取從頭開始的30s ffmpeg -ss 00:00:00 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split.mp4 //截取從30s開始的30s ffmpeg -ss 00:00:30 -t 00:00:30 -i keyoutput.mp4 -vcodec copy -acodec copy split1.mp4 //進(jìn)行視頻的合并 ffmpeg -f concat -i list.txt -c copy concat.mp4
在list.txt文件中,對要合并的視頻片段進(jìn)行了描述。 內(nèi)容如下
file ./split.mp4 file ./split1.mp4
更多常用命令:
ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4 // 去掉視頻中的音頻 ffmpeg -i input.mp4 -vcodec copy -an output.mp4 // -an: 去掉音頻;-vcodec:視頻選項,一般后面加copy表示拷貝 // 提取視頻中的音頻 ffmpeg -i input.mp4 -acodec copy -vn output.mp3 // -vn: 去掉視頻;-acodec: 音頻選項, 一般后面加copy表示拷貝 // 音視頻合成 ffmpeg -y –i input.mp4 –i input.mp3 –vcodec copy –acodec copy output.mp4 // -y 覆蓋輸出文件 //剪切視頻 ffmpeg -ss 0:1:30 -t 0:0:20 -i input.mp4 -vcodec copy -acodec copy output.mp4 // -ss 開始時間; -t 持續(xù)時間 // 視頻截圖 ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg // -s 設(shè)置分辨率; -f 強(qiáng)迫采用格式fmt; // 視頻分解為圖片 ffmpeg –i test.mp4 –r 1 –f image2 image-%3d.jpg // -r 指定截屏頻率 // 將圖片合成視頻 ffmpeg -f image2 -i image%d.jpg output.mp4 //視頻拼接 ffmpeg -f concat -i filelist.txt -c copy output.mp4 // 將視頻轉(zhuǎn)為gif ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif // -pix_fmt 指定編碼 // 將視頻前30幀轉(zhuǎn)為gif ffmpeg -i input.mp4 -vframes 30 -f gif output.gif // 旋轉(zhuǎn)視頻 ffmpeg -i input.mp4 -vf rotate=PI/2 output.mp4 // 縮放視頻 ffmpeg -i input.mp4 -vf scale=iw/2:-1 output.mp4 // iw 是輸入的寬度, iw/2就是一半;-1 為保持寬高比 //視頻變速 ffmpeg -i input.mp4 -filter:v setpts=0.5*PTS output.mp4 //音頻變速 ffmpeg -i input.mp3 -filter:a atempo=2.0 output.mp3 //音視頻同時變速,但是音視頻為互倒關(guān)系 ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4 // 視頻添加水印 ffmpeg -i input.mp4 -i logo.jpg -filter_complex [0:v][1:v]overlay=main_w-overlay_w-10:main_h-overlay_h-10[out] -map [out] -map 0:a -codec:a copy output.mp4 // main_w-overlay_w-10 視頻的寬度-水印的寬度-水印邊距; // 截取視頻局部 ffmpeg -i in.mp4 -filter:v "crop=out_w:out_h:x:y" out.mp4 // 截取部分視頻,從[80,60]的位置開始,截取寬200,高100的視頻 ffmpeg -i in.mp4 -filter:v "crop=80:60:200:100" -c:a copy out.mp4 // 截取右下角的四分之一 ffmpeg -i in.mp4 -filter:v "crop=in_w/2:in_h/2:in_w/2:in_h/2" -c:a copy out.mp4 // 截去底部40像素高度 ffmpeg -i in.mp4 -filter:v "crop=in_w:in_h-40" -c:a copy out.mp4
參數(shù)說明:
-vcodec xvid 使用xvid壓縮
-s 320×240 指定分辨率
-r fps 設(shè)置幀頻 缺省25
-b <比特率> 指定壓縮比特
-acodec aac 設(shè)定聲音編碼
-ac <數(shù)值> 設(shè)定聲道數(shù),1就是單聲道,2就是立體聲
-ar <采樣率> 設(shè)定聲音采樣率,PSP只認(rèn)24000
-ab <比特率> 設(shè)定聲音比特率
-vol <百分比> 設(shè)定音量
-y 覆蓋輸出文件
-t duration 設(shè)置紀(jì)錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設(shè)置標(biāo)題
-author string 設(shè)置作者
-copyright string 設(shè)置版權(quán)
-hq 激活高質(zhì)量設(shè)置
-aspect aspect 設(shè)置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設(shè)置頂部切除帶大小 像素單位
-cropbottom size -cropleft size -cropright size
-padtop size 設(shè)置頂部補(bǔ)齊的大小 像素單位
-padbottom size -padleft size -padright size -padcolor color 設(shè)置補(bǔ)齊條顏色(hex,6個16進(jìn)制的數(shù),紅:綠:蘭排列,比如 000000代表黑色)
-bt tolerance 設(shè)置視頻碼率容忍度kbit/s
-maxrate bitrate設(shè)置最大視頻碼率容忍度
-minrate bitreate 設(shè)置最小視頻碼率容忍度
-bufsize size 設(shè)置碼率控制緩沖區(qū)大小
-vcodec codec 強(qiáng)制使用codec編解碼方式。 如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝
-sameq 使用同樣視頻質(zhì)量作為源(VBR)
-pass n 選擇處理遍數(shù)(1或者2)。兩遍編碼非常有用。第一遍生成統(tǒng)計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀(jì)錄文件名為file
-map file:stream 設(shè)置輸入流映射
-debug 打印特定調(diào)試信息
上述就是小編為大家分享的Serverless中怎么實現(xiàn)視頻壓縮與格式轉(zhuǎn)換了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱:Serverless中怎么實現(xiàn)視頻壓縮與格式轉(zhuǎn)換
分享網(wǎng)址:http://www.rwnh.cn/article6/gshcig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、、網(wǎng)站策劃、搜索引擎優(yōu)化、品牌網(wǎng)站制作、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)