中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Serverless中怎么實現視頻壓縮與格式轉換

發布時間:2021-08-06 17:36:45 來源:億速云 閱讀:198 作者:Leah 欄目:云計算

這期內容當中小編將會給大家帶來有關Serverless中怎么實現視頻壓縮與格式轉換,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

準備開始ffmpeg

在百科上可以看到這樣的描述:

FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec里很多code都是從頭開發的。 FFmpeg在Linux平臺下開發,但它同樣也可以在其它操作系統環境中編譯運行,包括Windows、Mac OS X等。這個項目最早由Fabrice Bellard發起,2004年至2015年間由Michael Niedermayer主要負責維護。許多FFmpeg的開發人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務器上。項目的名稱來自MPEG視頻編碼標準,前面的"FF"代表"Fast Forward"。

而在實際生產生活中,ffmpeg確實也是一個非常好的工具,我們可以通過這個工具來進行圖像的壓縮/轉碼等操作。

通過ffmpeg的官網,我們可以看到不同的操作系統,有著不同的文件供我們選擇:

Serverless中怎么實現視頻壓縮與格式轉換

也就是說,我們如果要在云函數中使用這個模塊,那么我們就要有這樣一個模塊是在云函數所在的環境下可以運行起來的,根據云函數的文檔可以看到:

Serverless中怎么實現視頻壓縮與格式轉換

也就是說,我們要有一個在CentOS操作系統下可以使用的ffmpeg,接下來,我們就準備這個文件:

  1. 在CentOS操作系統上,下載源碼包:wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz

  2. 解壓并進入目錄:tar -zxvf ffmpeg-3.1.tar.gz && cd ffmpeg-3.1

  3. 編譯安裝: ./configure && make && make install

在進行./configure操作的時候,可能出現yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild錯誤。

yasm是匯編編譯器,ffmpeg為了提高效率使用了匯編指令,如MMX和SSE等。所以系統中未安裝yasm時,就會報錯誤,此時可以安裝yasm編譯器來解決:

  1. 下載wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz

  2. 解壓并進入目錄:tar zxvf yasm-1.3.0.tar.gz && cd yasm-1.3.0

  3. 編譯安裝:./configure && make && make install

完成ffmpeg的編譯安裝,可以在當前目錄下看到生成了文件:ffmpeg

此時我們保存這個文件即可在騰訊云的云函數中使用。

Serverless助力視頻壓縮

按照騰訊云提供的時間架構圖,我們可以看到其推薦的是對象存儲觸發器觸發函數,也就是說我們將視頻存儲到對象存儲中,然后通過對象存儲的相關觸發器觸發函數,進行視頻的處理,處理之后再回傳對象存儲的操作。

代碼實現:

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目錄,并且賦予權限
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)

        # 執行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]
        )

這里的主要操作就是在容器建立的時候,或者說是函數冷啟動的時候,將ffmpeg復制到可執行目錄,并且設置其權限為755

完成之后可以進行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文件上傳到對應的存儲的source/文件夾中:

Serverless中怎么實現視頻壓縮與格式轉換

稍等片刻,我們可以看到目標文件夾出現了對應的視頻:

Serverless中怎么實現視頻壓縮與格式轉換

可以看到兩個視頻文件的差距。

當然,這里僅僅是通過/tmp/ffmpeg -i 原視頻 -r 10 -b:a 32k 生成視頻來進行視頻壓縮,除此之外,我們還可以使用ffmpeg進行額外的操作(以下內容來源于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秒結束,總共30秒的視頻。這個命令執行很快,因為只是原始數據的拷貝,中間沒有什么編碼和解碼的過程。執行這個命令后你能得到output.mp4這個輸出文件。你可以用視頻播放軟件播放這個視頻看看。

可能有些視頻裁剪后的效果,如期望一致,00秒開始,30秒結束,總共30秒的視頻,但是有些視頻裁剪后你會發現可能開始和結束都不是很準確,有可能是從00秒開始,33秒結束。這是為什么呢?

因為這些視頻里30秒處地方剛好不是關鍵幀,而ffmpeg會在你輸入的時間點附近圓整到最接近的關鍵幀處,然后做接下來的事情。如果你不懂什么是關鍵幀,沒關系,這也不影響你使用這個命令。

合并視頻

//截取從頭開始的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
//進行視頻的合并
ffmpeg -f concat -i list.txt -c copy concat.mp4

在list.txt文件中,對要合并的視頻片段進行了描述。 內容如下

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 持續時間
 
// 視頻截圖
ffmpeg –i test.mp4 –f image2 -t 0.001 -s 320x240 image-%3d.jpg
// -s 設置分辨率; -f 強迫采用格式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
 
// 將視頻轉為gif
ffmpeg -i input.mp4 -ss 0:0:30 -t 10 -s 320x240 -pix_fmt rgb24 output.gif
// -pix_fmt 指定編碼
 
// 將視頻前30幀轉為gif
ffmpeg -i input.mp4 -vframes 30 -f gif output.gif
 
// 旋轉視頻
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
 
//音視頻同時變速,但是音視頻為互倒關系
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

參數說明:

-vcodec xvid 使用xvid壓縮
-s 320×240 指定分辨率
-r fps 設置幀頻 缺省25
-b <比特率> 指定壓縮比特
-acodec aac 設定聲音編碼
-ac <數值> 設定聲道數,1就是單聲道,2就是立體聲
-ar <采樣率> 設定聲音采樣率,PSP只認24000
-ab <比特率> 設定聲音比特率
-vol <百分比> 設定音量
-y 覆蓋輸出文件
-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置作者
-copyright string 設置版權
-hq 激活高質量設置
-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設置頂部切除帶大小 像素單位
-cropbottom size -cropleft size -cropright size
-padtop size 設置頂部補齊的大小 像素單位
-padbottom size -padleft size -padright size -padcolor color 設置補齊條顏色(hex,6個16進制的數,紅:綠:蘭排列,比如 000000代表黑色)
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩沖區大小
-vcodec codec 強制使用codec編解碼方式。 如果用copy表示原始編解碼數據必須被拷貝
-sameq 使用同樣視頻質量作為源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀錄文件名為file
-map file:stream 設置輸入流映射
-debug 打印特定調試信息

上述就是小編為大家分享的Serverless中怎么實現視頻壓縮與格式轉換了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

利津县| 江西省| 通河县| 兰考县| 秭归县| 秀山| 浏阳市| 缙云县| 八宿县| 蕲春县| 且末县| 内黄县| 红河县| 长海县| 全南县| 防城港市| 平泉县| 宁波市| 和田县| 综艺| 忻州市| 锡林郭勒盟| 上虞市| 县级市| 洛浦县| 南溪县| 昂仁县| 渝北区| 永修县| 金湖县| 隆化县| 榕江县| 慈利县| 清水河县| 大连市| 扎兰屯市| 白银市| 安福县| 西乌| 广饶县| 开远市|