记一次七牛云存储文件MOV转MP4
创始人
2025-05-30 02:48:19
0

经过

我们最近的一次开发过程中,发现存在如下一个问题:iOS上传的视频是MOV格式的,Android上传的视频是MP4格式的,本来iOS和Android之间视频是相互兼容的,也就是iOS端也可以播放Andorid的mp4格式的视频,Android也可以播放iOS端MOV格式的视频,本来相安无事,最近因为需要做分享,做成H5分享成Web页面,那么Web页面就需要兼容MOV和MP4两种格式的视频,查了一下,发现H5的video 标签是默认不支持MOV格式的视频的,因此有如下几种方式去实现:

  1. 开发兼容MOV格式的VideoPlayer,这种最简单,移动端和后端都不需要更改代码;
  2. iOS端口在上传时,自行将MOV格式转码为MP4格式,这样也只需要iOS大改;
  3. 后端直接进行转码,直接将MOV格式的视频转码为MP4,这样可以做到前端无感。

思前想后这三种方案之后,由于历史原因和工期比较紧,因此我们采用了第三种方式,直接在后端进行转码,对前端无感发布。所幸我们使用的存储服务是七牛云,这次转存需求非常顺利,因此就记录下来,希望帮助到有需要的人。

准备阶段

首先,我们现在的需求是稍微有些尴尬的,是因为我们七牛云存储库里面已经存在了大量的MOV文件了,那么这里的转码就存在两种情况了:

  1. 对于存量的MOV文件,如何将已经存在MOV文件转存成MP4文件;
  2. 对于未上传的MOV文件,如果做到上传完成时及时转存。

a. 存量文件处理

其实七牛提供了相应的API:

1.转码规格参数 fops 可以替换,转码参数规格文档参考这里
https://developer.qiniu.com/dora/manual/1248/audio-and-video-transcoding-avthumb
实例
java-sdk: https://github.com/qiniu/java-sdk/blob/master/examples/pfop_vframe.java
php-sdk:https://github.com/qiniu/php-sdk/blob/master/examples/pfop_vframe.php
pythons-sdk: https://github.com/qiniu/python-sdk/blob/master/examples/pfop_vframe.py
node-sdk: https://github.com/qiniu/nodejs-sdk/blob/master/examples/video_pfop.js
go-sdk: https://github.com/qiniu/api.v7/blob/master/examples/video_pfop.go

下面就以Java-sdk为例子,简单说明一下如何转存:

  1. 首先,我们需要理解,七牛并没有提供相应的SDK,来说明它的存储空间(bucket)中哪些文件是MOV格式的,也就是说七牛并不提供查找的策略,我想这也可能是为了安全着想。但是万幸的是,我们自己系统的数据库中存储了这些MOV文件,数据库中把这些文件拉一下即可:
    在这里插入图片描述
    然后我们可以使用代码:
public static void main(String[] args) throws QiniuException {//设置账号的AK,SKString ACCESS_KEY = "Access_Key";String SECRET_KEY = "Secret_Key";Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);//新建一个OperationManager对象OperationManager operater = new OperationManager(auth);//设置要转码的空间和key,并且这个key在你空间中存在String bucket = "Bucket_Name";String key = "Bucket_key";//设置转码操作参数String fops = "avthumb/mp4/avsmart/1";//设置转码的队列String pipeline = "yourpipelinename";//可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间。String urlbase64 = UrlSafeBase64.encodeToString("目标Bucket_Name:自定义文件key");String pfops = fops + "|saveas/" + urlbase64;//设置pipeline参数StringMap params = new StringMap().putWhen("force", 1, true).putNotEmpty("pipeline", pipeline);try {String persistid = operater.pfop(bucket, key, pfops, params);//打印返回的persistidSystem.out.println(persistid);} catch (QiniuException e) {//捕获异常信息Response r = e.response;// 请求失败时简单状态信息System.out.println(r.toString());try {// 响应的文本信息System.out.println(r.bodyString());} catch (QiniuException e1) {//ignore}}}

这里分别解释一下上述参数值:

  1. ACCESS_KEY 和 SECRET_KEY

七牛上传凭证,七牛后端可以提供

  1. Bucket_Name 和 Bucket_Key
    这里的Bucket_Name就是你的空间名称,例如在七牛后台,你创建的空间:

    这里的 Bucket_Key 就是此空间下你需要转存的地址,比如存在一个地址:https://www.image.com/abc.mov, 那么此时你的Bucket_Key应该为 abc.mov;

  2. fops
    转码参数,具体参数详解可以参考文档:https://developer.qiniu.com/dora/6097/perceptive-transcoding-avsmart-1
    avthumb/mp4/avsmart/1说明我启用了锐智转码,可以在不同的网络环境下节省流量;

  3. pipeline
    设置转码的队列,这个地方如果你没有设置的话,可以填写默认的:default.sys,当然我们可以自定我们自己的队列:
    先找到智能多媒体:
    在这里插入图片描述
    在智能多媒体中,找到队列,然后就可以新建队列了。
    在这里插入图片描述
    个人的建议是新建一个私有队列,私有队列的处理速度要快于默认队列“default.sys”。

  4. 目标Bucket_Name:自定义文件key
    你转码之后,需要存储的空间名称,然后转码之后的文件名称。
    比如你在A空间的中存在a.mov文件,此时要转码存储到B空间中,文件名更改为b.mp4。那么此时可以写为:B:b.mp4;

基本上逻辑就介绍完毕了,然后代码执行就可以了。因为执行是异步的,所以不会一下就能转码完成,此时我们可以通过后台来查看转码队列中的任务转码情况。
在这里插入图片描述

b.即将上传的文件

本来是想在移动端上传时,在移动端进行转码再提交,但是效率低下,iOS客户端改动量也比较大,因此还是选择在后端进行监听转码。至于监听转码是什么意思呢?就是我上传了一个视频,首先我检测一下这个视频是否是MOV格式的,如果是,那么我就进行MP4的转码,如果是其它文件就不进行任务操作。这种逻辑类似于Android中的监听器,数据库中的触发器。当然,七牛云后台也提供了类似的服务:我们找到智能多媒体服务,然后再新增触发器任务:


在这里插入图片描述
然后点击新建任务,开始创建任务:
在这里插入图片描述
这里是进行了任务的自定义,以图示的方式展现了代码的原理,首先我们拿到任务之后开始锐智转码,然后进行输出即可。

任务创建完成之后,我们可以触发器任务列表看到任务列表。上图可以看到,我创建了两条任务,一条是针对 .mov文件格式,一条是针对 .MOV 格式文件,因为七牛暂时还不支持 大小写不区分的功能,因此我们需要创建两条。

创建任务完成之后,我们可以测试一下触发器任务是否成功。操作很简单,直接在七牛云后台上传一个MOV文件:
在这里插入图片描述
上传完成之后,我们可以去转码队列中查看一下任务,这里有一个待转码的任务,说明我们的触发器任务创建成功了。
在这里插入图片描述
等到任务完成之后,我们再找到一下这个 test_mov文件,看看是否存在:
在这里插入图片描述
这里可以看到,我们的MOV文件被转码成了mp4文件,因此整个逻辑是正常的,现在小伙伴们可以像以前一样正常的上传文件了。

基本逻辑完成了,问题并不是特别困难,但是其中也踩了一些坑,希望能帮助到大家,如果有问题,可以联系我:

相关内容

热门资讯

银行、消金公司助贷余额增速不得... 近日,中国证券报记者从多位业内人士处独家获悉,5月以来,多地金融监管部门对部分中小银行、消金公司下达...
朱鸿接任陈航,担任钉钉科技有限... 消费日报-今朝新闻讯 天眼查显示,6月23日,钉钉科技有限公司发生工商变更,陈航卸任法定代表人、董事...
3日累跌超20%,德创环保:公... 6月25日, 德创环保(603177.SH)公告,公司股票于2026年6月23日、6月24日和6月2...
北京发布2026年第七轮拟供商... 央广网北京6月25日消息(记者门庭婷)6月25日,北京市规划和自然资源委员会网站发布了2026年第七...
开放麦 | 启明创投胡奇:从A... “2026年,创投圈的浪潮再次翻涌:AI从技术概念走进产业深水区,硬科技创业从“小众赛道” 变成“主...
腾讯孙忠怀:在行业转身处 6月24日,2026腾讯视频年度发布在上海举行。腾讯公司副总裁、腾讯在线视频董事长孙忠怀以《在行业转...
加息,突变!美联储,重磅传来!... 美联储政策路径突生变数。 美国商务部经济分析局最新公布的数据显示,5月个人消费支出(PCE)物价指数...
6月合肥上门收金必看!5步避坑... 2026年6月,合肥黄金市场持续高位运行,不少市民翻出家里闲置的旧金饰、投资金条想变现,上门回收因为...
潮汕女富豪挂帅后加码液冷!祥鑫... 潮汕女强人,带着百亿公司加码液冷散热。 6月24日晚间,祥鑫科技(002965.SZ)公告称,公司董...
马斯克向太空要电,GobiX ... 一场关于「去哪里找电」的全球竞赛,正在朝两个方向展开。 作者|周永亮 编辑| 郑玄 「太空光伏是不是...
原料药行业陷入周期低谷 有药企... 每经记者|许立波 每经编辑|魏文艺 “过完年到现在,我们整个团队每个月都在出差,跑遍了亚非拉、欧美市...
家门口筛查白内障!永顺泽家镇暖... 大众卫生报·新湖南客户端6月25日讯(通讯员 彭雪姣)为切实解决辖区老年性白内障患者异地就医奔波、就...
终于等到!油价马上再大跌,这个... 点击添加图片描述(最多60个字) 编辑 各位车主朋友,好消息接二连三! 继6月18日油价大幅下调...
丈量出海新路 世界酒庄影响力指... 长期以来,全球酒庄评价体系由西方机构主导,且大多局限于单一酒种、单一评价维度,这一局面正逐渐被打破。...
峰瑞资本创始合伙人李丰:从资本... “2026年,创投圈的浪潮再次翻涌:AI从技术概念走进产业深水区,硬科技创业从“小众赛道” 变成“主...
原创 A... 迈向成熟,还有茁壮成长的机会。 作者 | 方璐 编辑丨于婞 来源 | 野马财经 2026年6月21日...
为企业解锁出海新通道!亚太中小... 6月24日下午,作为2026年APEC中小企业工商论坛的重要组成部分,亚太中小企业国际化合作发展论坛...
君赛生物港股IPO,增聘兴证国... 跟丰宜科技一样,正冲刺港股IPO的上海君赛生物股份有限公司(简称“君赛生物”)增聘一位整体协调人。 ...
圣邦股份明日上市:暗盘涨24%... 雷递网 雷建平 6月25日 圣邦微电子(北京)股份有限公司(简称:“圣邦股份”,股票代码:“0366...
科技“吃肉”,券商跟着“喝汤”... 当科技持续成为市场核心主线,押中硬科技项目的券商也成为被追逐的焦点。 6月24日,半导体零部件概念股...