七牛云 转码_七牛云试用指南-音视频基本处理
對于音頻、視頻等多媒體資源,七牛云也提供了豐富的處理指令,包含但不限于以下指令:
本篇從獲取音視頻元信息入手,順序講解各個處理指令。
■ 獲取音視頻元信息
使用avinfo接口可以非常方便地獲取一個音視頻資源的相關(guān)元信息:
http://.qiniudn.com/?avinfo
或
http:///?avinfo
以美劇《黑名單》第1季第12集的預(yù)告片(flv資源)為例,在瀏覽器中打開如下URL:
http://qiniu-developer.u.qiniudn.com/samples/黑名單-S01E12.flv?avinfo
將返回一個JSON格式組織的元信息對象:
{
"streams": [
{
"index": 0,
"codec_name": "h264",
"codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
"codec_type": "video",
"codec_time_base": "1001/60000",
"codec_tag_string": "avc1",
"codec_tag": "0x31637661",
"width": 1280,
"height": 720,
...省略過長內(nèi)容...
},
{
"index": 1,
"codec_name": "aac",
"codec_long_name": "Advanced Audio Coding",
"codec_type": "audio",
"codec_time_base": "1/44100",
"codec_tag_string": "mp4a",
"codec_tag": "0x6134706d",
"sample_fmt": "s16",
"sample_rate": "44100",
"channels": 2,
...省略過長內(nèi)容...
}
],
"format": {
"nb_streams": 2,
"format_name": "mov,mp4,m4a,3gp,3g2,mj2",
"format_long_name": "QuickTime/MPEG-4/Motion JPEG 2000 format",
"start_time": "0.000000",
"duration": "29.070000",
"size": "8702170",
"bit_rate": "2394818",
"tags": {
"major_brand": "mp42",
"minor_version": "0",
"compatible_brands": "isommp42",
"creation_time": "2014-01-13 08:43:21"
}
}
}
可以看到音頻、視頻和封裝格式信息被準(zhǔn)確地描述出來。
■ 基本音視頻處理
avthumb接口支持的基本音視頻處理包括:轉(zhuǎn)換編碼(如h264轉(zhuǎn)x264,mp3轉(zhuǎn)aac);
轉(zhuǎn)換封裝格式(如flv轉(zhuǎn)mp4)
截取片段;
修改編碼碼率;
修改分辨率。
以前文的flv資源為例,若只想簡單地轉(zhuǎn)碼為mp4格式,可以使用如下URL達成目的:
http://qiniu-developer.u.qiniudn.com/samples/黑名單-S01E12.flv?avthumb/mp4
接收到這樣的請求后,七牛云將對指定資源執(zhí)行實時轉(zhuǎn)碼操作,緩存結(jié)果后將新資源返回給請求端。點擊查看轉(zhuǎn)碼效果。
注意:avthumb接口是同步接口,如原資源過大將導(dǎo)致訪問端超時返回,因此本示例僅作為用法演示,強烈建議正式生產(chǎn)環(huán)境中使用預(yù)轉(zhuǎn)持久化處理接口或觸發(fā)持久化處理接口進行預(yù)處理,加快訪問速度;
為加快訪問速度,轉(zhuǎn)碼后的結(jié)果還將被七牛云緩存起來,不計入存儲空間,節(jié)省計算資源,過期失效后會重新觸發(fā)計算。
■ 預(yù)轉(zhuǎn)持久化處理
上傳時,通過在上傳策略中指定persistentOps字段的值,可以觸發(fā)七牛云對上傳資源進行指定的數(shù)據(jù)處理。還可以同時指定persistentNotifyUrl字段的值,以便將持久化處理結(jié)果及時通知給業(yè)務(wù)端處理。
以前文的flv資源為例,若想預(yù)先轉(zhuǎn)換成mp4格式并持久存儲結(jié)果(計入存儲空間),可以使用以下兩個Ruby程序來完成。
1. [簡易HTTP服務(wù)器] 接收預(yù)轉(zhuǎn)持久化處理的結(jié)果,并將狀態(tài)信息打印到終端上:
#!/usr/bin/env ruby
# encoding : utf-8
# persistent_notify_server.rb
require 'json'
require 'xmlrpc/httpserver'
class PersistentNotifyHandler
@@count = 0
public
def ip_auth_handler(io)
# 任何請求都允許處理
return true
end # ip_auth_handler
def request_handler(request, response)
# 讀取請求報文
body = request.data.read_nonblock(65536)
# 重新格式化JSON對象
json = JSON.generate(
JSON.parse(body),
{
indent: ' ',
object_nl: "\n",
array_nl: "\n",
}
)
# 輸出
puts json
# 計數(shù)
@@count += 1
# 構(gòu)造響應(yīng)報文(可選)
response.body = 'OK'
end # request_handler
def self.count()
return @@count
end # self.count
end # PersistentNotifyHandler
svr = HttpServer.new(
PersistentNotifyHandler.new(), # 請求處理器
9090, # 端口
'0.0.0.0' # 監(jiān)聽IP
)
svr.start
while (PersistentNotifyHandler.count() == 0)
puts 'waiting for notification...'
sleep(60)
end
svr.shutdown
2. [HTTP客戶端]上傳flv文件并觸發(fā)預(yù)轉(zhuǎn)持久化處理:
#!/usr/bin/env ruby
# encoding : utf-8
# put_flv_file.rb
require 'json'
require 'net/http'
require 'base64'
require 'openssl'
# 根據(jù)傳入?yún)?shù),構(gòu)造一個上傳策略(觸發(fā)預(yù)轉(zhuǎn)持久化處理)
def put_policy(bucket, expires, persistentOps, persistentNotifyUrl)
# 生成一個Hash對象
put_policy = Hash.new()
# 僅指定目標(biāo)存儲空間,即“新增資源”語意:
# 資源不存在則創(chuàng)建
# 資源已存在,且與上傳內(nèi)容不一致則失敗
put_policy['scope'] = "#{bucket}"
# 計算授權(quán)有效期截止時間,UNIX時間戳格式
put_policy['deadline'] = (Time.now() + expires).tv_sec()
# 指定預(yù)轉(zhuǎn)持久化處理的指令
put_policy['persistentOps'] = persistentOps
# 指定預(yù)轉(zhuǎn)持久化處理的結(jié)果通知URL
put_policy['persistentNotifyUrl'] = persistentNotifyUrl
# 序列化為JSON字符串
return JSON.generate(put_policy)
end # put_policy
# 根據(jù)傳入的上傳策略,生成對應(yīng)的上傳授權(quán)憑證
def upload_token(access_key, secret_key, put_policy)
# 對上傳策略做UrlSafe-Base64編碼
encoded_put_policy = Base64.urlsafe_encode64(put_policy)
# 使用SHA1作為HASH函數(shù),生成簽名
sign = OpenSSL::HMAC.digest(
'sha1',
secret_key,
encoded_put_policy
)
# 對簽名做UrlSafe-Base64編碼
encoded_sign = Base64.urlsafe_encode64(sign)
# 拼出上傳授權(quán)憑證,以“:”作為分隔符
return "#{access_key}:#{encoded_sign}:#{encoded_put_policy}"
end # upload_token
BUCKET = 'qiniu-ts-demo' # 使用時請更換成真實的存儲空間名
EXPIRES = 3600
ACCESS_KEY = 'MY_ACCESS_KEY' # 使用時請更換成真實的AccessKey
SECRET_KEY = 'MY_SECRET_KEY' # 使用時請更換成真實的SecretKey
PERSISTENT_OPS = 'avthumb/mp4' # 持久化處理指令
PERSISTENT_NOTIFY_URL = 'http://fake.com:9090' # 使用時請更換成真實的域名和端口
# 生成上傳授權(quán)憑證
upload_token = upload_token(
ACCESS_KEY,
SECRET_KEY,
put_policy(
BUCKET,
EXPIRES,
PERSISTENT_OPS,
PERSISTENT_NOTIFY_URL
)
)
# 指定請求報文中的各個參數(shù)
file_name = '黑名單-S01E12.flv' # 使用時請更換成真實的文件
file_content = File.open(file_name, 'rb') do |fh|
fh.read()
end
puts 'file size is %s' % file_content.size
boundary = 'a-string-never-exists-in-the-uploading-file'
# 生成請求報文體
req_body = <
Content-Disposition: form-data; name="token"
#{upload_token}
--#{boundary}
Content-Disposition: form-data; name="key"
#{file_name}
--#{boundary}
Content-Disposition: form-data; name="file"; filename="#{file_name}"
Content-Type: video/x-flv
Content-Transfer-Encoding: binary
HTTP_BODY
# 轉(zhuǎn)換換行符
req_body.gsub!(/\n/, "\r\n")
req_body = req_body.force_encoding('ASCII-8BIT') + file_content + "\r\n--#{boundary}--\r\n"
# 生成Headers
req_headers = Hash.new()
req_headers['Host'] = "up.qiniu.com"
req_headers['Content-Type'] = "multipart/form-data; boundary=#{boundary}"
req_headers['Content-Length'] = "#{req_body.size}"
# 發(fā)送請求
http_client = Net::HTTP.new('up.qiniu.com', 80)
resp = http_client.post(
'/',
req_body,
req_headers
)
# 解析響應(yīng)
puts "HTTP Code=#{resp.code}"
puts "HTTP Msg=#{resp.msg}"
puts "HTTP Body=#{resp.body()}"
先啟動服務(wù)器,然后執(zhí)行上傳程序,等待一段時間后便可收到預(yù)轉(zhuǎn)成功的通知結(jié)果:
[Mon Jan 20 19:10:19 2014] HttpServer 0.0.0.0:9090 client:39573 115.238.138.231<115.238.138.231> connect
{
"id":"16i99r7gjlrc8r9213",
"code":0,
"desc":"The fop was completed successfully",
"items":[
{
"cmd":"avthumb/mp4",
"code":0,
"desc":"The fop was completed successfully",
"error":"",
"hash":"lpqijRaQ4c_CPoKDL1bLWK7TUoI3",
"key":"UAA-4hndfVc5V6DJX0EvslAUBBI=/ll8spobyuu_F112ZWyG6Va4qk4Ch"
}
]
}
[Mon Jan 20 19:10:19 2014] HttpServer 0.0.0.0:9090 client:39573 disconnect
[Mon Jan 20 19:10:52 2014] HttpServer 0.0.0.0:9090 stop
其中,Key字段給出持久化的mp4資源的名字,即可以通過如下URL訪問轉(zhuǎn)換好的mp4視頻:
http://qiniu-ts-demo.qiniudn.com/UAA-4hndfVc5V6DJX0EvslAUBBI=/ll8spobyuu_F112ZWyG6Va4qk4Ch
點擊查看轉(zhuǎn)碼效果。
■ 咱們行進到哪兒了?
通過三個實例,初步講解了音視頻處理的基本接口(avinfo/avthumb),讀者應(yīng)該有能力自行編程實現(xiàn)上傳與觸發(fā)預(yù)轉(zhuǎn)持久化處理。
七牛云存儲 ? 2014 署名-非商業(yè)性使用-禁止演繹
允許自由轉(zhuǎn)載,請注明作者及出處。
總結(jié)
以上是生活随笔為你收集整理的七牛云 转码_七牛云试用指南-音视频基本处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS笔记
- 下一篇: 计算机英语反思总结怎么写,英语考试反思总