对于音频、视频等多媒体资源,七牛云也提供了丰富的处理指令,包含但不限于以下指令:

本篇从获取音视频元信息入手,顺序讲解各个处理指令。

■ 获取音视频元信息

使用avinfo接口可以非常方便地获取一个音视频资源的相关元信息:

http://.qiniudn.com/?avinfo

http:///?avinfo

以美剧《黑名单》第1季第12集的预告片(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,

...省略过长内容...

},

{

"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,

...省略过长内容...

}

],

"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"

}

}

}

可以看到音频、视频和封装格式信息被准确地描述出来。

■ 基本音视频处理

avthumb接口支持的基本音视频处理包括:转换编码(如h264转x264,mp3转aac);

转换封装格式(如flv转mp4)

截取片段;

修改编码码率;

修改分辨率。

以前文的flv资源为例,若只想简单地转码为mp4格式,可以使用如下URL达成目的:

http://qiniu-developer.u.qiniudn.com/samples/黑名单-S01E12.flv?avthumb/mp4

接收到这样的请求后,七牛云将对指定资源执行实时转码操作,缓存结果后将新资源返回给请求端。点击查看转码效果。

注意:avthumb接口是同步接口,如原资源过大将导致访问端超时返回,因此本示例仅作为用法演示,强烈建议正式生产环境中使用预转持久化处理接口或触发持久化处理接口进行预处理,加快访问速度;

为加快访问速度,转码后的结果还将被七牛云缓存起来,不计入存储空间,节省计算资源,过期失效后会重新触发计算。

■ 预转持久化处理

上传时,通过在上传策略中指定persistentOps字段的值,可以触发七牛云对上传资源进行指定的数据处理。还可以同时指定persistentNotifyUrl字段的值,以便将持久化处理结果及时通知给业务端处理。

以前文的flv资源为例,若想预先转换成mp4格式并持久存储结果(计入存储空间),可以使用以下两个Ruby程序来完成。

1. [简易HTTP服务器] 接收预转持久化处理的结果,并将状态信息打印到终端上:

#!/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

# 计数

@@count += 1

# 构造响应报文(可选)

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' # 监听IP

)

svr.start

while (PersistentNotifyHandler.count() == 0)

puts 'waiting for notification...'

sleep(60)

end

svr.shutdown

2. [HTTP客户端]上传flv文件并触发预转持久化处理:

#!/usr/bin/env ruby

# encoding : utf-8

# put_flv_file.rb

require 'json'

require 'net/http'

require 'base64'

require 'openssl'

# 根据传入参数,构造一个上传策略(触发预转持久化处理)

def put_policy(bucket, expires, persistentOps, persistentNotifyUrl)

# 生成一个Hash对象

put_policy = Hash.new()

# 仅指定目标存储空间,即“新增资源”语意:

# 资源不存在则创建

# 资源已存在,且与上传内容不一致则失败

put_policy['scope'] = "#{bucket}"

# 计算授权有效期截止时间,UNIX时间戳格式

put_policy['deadline'] = (Time.now() + expires).tv_sec()

# 指定预转持久化处理的指令

put_policy['persistentOps'] = persistentOps

# 指定预转持久化处理的结果通知URL

put_policy['persistentNotifyUrl'] = persistentNotifyUrl

# 序列化为JSON字符串

return JSON.generate(put_policy)

end # put_policy

# 根据传入的上传策略,生成对应的上传授权凭证

def upload_token(access_key, secret_key, put_policy)

# 对上传策略做UrlSafe-Base64编码

encoded_put_policy = Base64.urlsafe_encode64(put_policy)

# 使用SHA1作为HASH函数,生成签名

sign = OpenSSL::HMAC.digest(

'sha1',

secret_key,

encoded_put_policy

)

# 对签名做UrlSafe-Base64编码

encoded_sign = Base64.urlsafe_encode64(sign)

# 拼出上传授权凭证,以“:”作为分隔符

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' # 使用时请更换成真实的域名和端口

# 生成上传授权凭证

upload_token = upload_token(

ACCESS_KEY,

SECRET_KEY,

put_policy(

BUCKET,

EXPIRES,

PERSISTENT_OPS,

PERSISTENT_NOTIFY_URL

)

)

# 指定请求报文中的各个参数

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

# 转换换行符

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}"

# 发送请求

http_client = Net::HTTP.new('up.qiniu.com', 80)

resp = http_client.post(

'/',

req_body,

req_headers

)

# 解析响应

puts "HTTP Code=#{resp.code}"

puts "HTTP Msg=#{resp.msg}"

puts "HTTP Body=#{resp.body()}"

先启动服务器,然后执行上传程序,等待一段时间后便可收到预转成功的通知结果:

[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访问转换好的mp4视频:

http://qiniu-ts-demo.qiniudn.com/UAA-4hndfVc5V6DJX0EvslAUBBI=/ll8spobyuu_F112ZWyG6Va4qk4Ch

点击查看转码效果。

■ 咱们行进到哪儿了?

通过三个实例,初步讲解了音视频处理的基本接口(avinfo/avthumb),读者应该有能力自行编程实现上传与触发预转持久化处理。

七牛云存储 © 2014 署名-非商业性使用-禁止演绎

允许自由转载,请注明作者及出处。

七牛云 转码_七牛云试用指南-音视频基本处理相关推荐

  1. 七牛云 转码_七牛云的音频转码,微信的speex音频转码为mp3格式

    七牛云的音频转码.把微信的speex音频转码为mp3格式 node 代码 执行后.在对象存储里面就可以看到啦. var qiniu= require('qiniu'); //你的KEY var acc ...

  2. 七牛云 转码_七牛云存储 - 七牛 php sdk 上传 转码 问题

    实在是不会用 sdk 呀 都蒙圈了 求大神 指点 vendor('Qiniu.io'); vendor('Qiniu.rs'); $bucket = 'icunzai-voice'; $key = $ ...

  3. 七牛云 转码_七牛上传视频并转码

    /// ///上传视频到七牛并转码/// /// /// public static void UpLoadVideo(string saveKey, stringlocalFile) { Mac m ...

  4. 软件合码器-驾考-驾驶员考试-音视频合成-四合一-多路视频合成一路技术开发-音视频合码器

    本技术以实际开发实施案例为基础(驾驶员路考系统用的音视频监控合成) 软件合码器-驾考-驾驶员考试-音视频合成-四合一-多路视频合成一路技术开发-音视频合码器 软件效果: 设计流程: 简介 视频合成软件 ...

  5. 开发游戏陪玩app源码前,需要掌握的音视频格式知识

    为了让用户拥有更好的聊天体验,游戏陪玩app源码在开发时,采用了音视频连麦技术,通过语音或视频的方式快速拉近彼此的距离,哪怕在游戏过程中也不耽误彼此聊天.而且音视频连麦技术的应用还为游戏陪玩app源码 ...

  6. 视频编码h264怎么看_你所要知道的音视频--04

    上一篇文章我们主要讲解了音频压缩算法的主要指标,以及几个典型的音频压缩算法.本章将延续上一讲的内容,分析视频压缩算法. 视频压缩算法 视频压缩算法比较,Wiki百科官方收录分类,请自备梯子 视频压缩算 ...

  7. python 录音本地转文字_用Python将抖音视频转换为字符视频

    字符视频就是画面全部由字符组成的, 那么用代码怎么实现的呢?下面用python实现,话不多说,直接上干货. 代码实现详解 其实总体思路分为3个步骤: 1.将原视频分割成若干个图片以及分离出音频 2.将 ...

  8. FFmpeg源码分析:avcodec_send_frame()和avcodec_receive_packet()音视频编码

    FFmpeg在libavcodec模块,旧版本提供avcodec_encode_video2()作为视频编码函数,avcodec_encode_audio2()作为音频编码函数.在FFmpeg 3.1 ...

  9. 七牛云 转码_开发者选择短视频SDK,为何青睐七牛云?

    从文字到图片再到视频的互联网内容媒介发展途径,随着 5G 技术的逐渐落地愈发清晰.短视频市场中的角力也随着诸多资本和创业者的涌入,进入到白热化阶段.这样的情况下,选择合适的短视频SDK产品就显得尤为重 ...

最新文章

  1. qmake以及makefile总结
  2. linux内核模块编译
  3. __str__的用法
  4. 6-2 链式表的按序号查找
  5. 《BI项目笔记》多维数据集中度量值设计时的聚合函数
  6. 2道编程题:1.给定一个字符串,计算字符串中数值的个数并求和。
  7. pip换源及指令的使用
  8. JDK动态代理与CGLIB的区别
  9. mcuisp下载程序
  10. 制作可保存配置的U盘版BT4(BackTrack4 )
  11. Java通过坐标点进行拟合函数
  12. 会声会影x4素材_怎么给视频打马赛克?运用会声会影2019
  13. 俄罗斯方块游戏(Python实现)
  14. 语言模型Katz backoff以及HMM模型
  15. linux gcc error cc1,gcc找不到cc1plus
  16. Python中通过property实现属性的修改、删除、查看
  17. 磁力搜索网站+下载神器放送2019-03-05
  18. 中级财管电脑操作不会用计算机,很全面!2018年中级无纸化考试财管公式输入方法及计算器操作说明...
  19. 没看错!用游戏测试人工智能。
  20. xadmin自定义页面

热门文章

  1. 17 内存规整(memory compaction)
  2. 20年上海站D题Walker(二分,简洁)
  3. 第三章-集合论 3.2-Russell 悖论(选读)
  4. windows点阵字体转linux版,Deepin 20.1下安装和配置点阵字体,可解决低分屏字体模糊问题...
  5. 区块链:Casper 机制的历史起源-第三篇
  6. 围棋的分数计算机,围棋比赛积分规则
  7. 高精度阶乘和 高精度算法(c语言)
  8. lisp把选集转成表_cad_lisp基础教程.pdf
  9. Qt中pri文件介绍及使用(图文超级简单!!)
  10. 家庭公网IP动态解析至阿里云DNS