精华内容
下载资源
问答
  • 腾讯游戏多媒体解决方案

    千次阅读 2018-07-10 13:27:05
    欢迎大家前往腾讯+社区,获取更多腾讯海量技术实践干货哦~ 本文由云计算小编 发表于云+社区专栏 《QQ 炫舞手游》是腾讯游戏推出的音舞类游戏。据App Annie 数据显示, 发布以来《QQ 炫舞手游》一直保持...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

    本文由云计算小编 发表于云+社区专栏

    《QQ 炫舞手游》是腾讯游戏推出的音舞类游戏。据App Annie 数据显示, 自发布以来《QQ 炫舞手游》一直保持音舞类游戏排名第1,深受广大玩家欢迎。《QQ 炫舞手游》的一大特色玩法就是游戏内的K 歌功能, 玩家可以通过休闲大厅创建K 歌房, 选择伴奏进行K 歌。游戏多媒体引擎GME 的高音质、低延时及强网络抗性,为《QQ 炫舞手游》的音乐听感和K 歌效果提供了良好的支持。 GME 可以保证玩家在房间内播放背景音乐的同时, 实时语音沟通依然清晰流畅;当有玩家在房间内实时K 歌时, 听众听到的K歌效果也能保持极高的音质和极低的延时, 提供了良好的线上K 歌体验。那么,《QQ 炫舞手游》背后的音视频到底是什么呢?今天这篇文章将揭开音视频的神秘面纱。

    腾讯音视频实验室

    说到音频,就不得不说腾讯音视频实验室了,腾讯音视频实验室,成立于2010年,八年间专注于音视频通信技术的前瞻性研究,包括全球实时音视频网络优化、音视频编解码前沿算法研究、计算机视觉图像处理、基于AI的音频语音增强、声音美化及音视频质量评测等。在服务于腾讯社交体系下的海量用户同时,在实时音视频通信、图像处理和音视频处理等技术领域积累了十几年的研究经验,拥有行业领先的技术水平。目前已为行业数百个产品提供了音视频技术支持与服务,如QQ电话、腾讯云、企业微信、QQ空间、全民K歌、快手、斗鱼、虎牙、蘑菇街等。

    img

    游戏实时语音解决方案 GME

    游戏多媒体引擎(Game Multimedia Engine,简称:GME)是一个专门针对游戏场景定制的游戏多媒体引擎 SDK,支持休闲社交类、竞技游戏类(包括 MMORPG、MOBA、FPS 等类型)、大型国战等多种游戏类型,提供了包括多人实时语音、实时视频、语音消息、语音转文本等功能。

    img

    功能介绍

    实时语音

    麦序模式

    用户轮流语音上麦,音质高流畅性好,适用于语音狼人杀等场景。

    自由通话模式

    支持多人同时讲话,超低延迟,适用于多人组队开黑等竞技游戏场景。

    指挥模式

    针对一对多指挥作战、主播语音陪玩等场景,适合大型国战类游戏。

    语音消息和语音识别

    支持录制语音消息发送到游戏各频道并实时转换为文本消息这功能,音质清晰,语音识别准确率高。

    产品优势

    我们的优势为什么选择腾讯云游戏多媒体引擎
    游戏场景定制针对游戏场景对音视频编解码器进行深度优化,使其在码率、延时、系统资源消耗等关键技术指标达到业界领先
    顶级基础设施自建万兆云机房,配备 20 线 BGP 顶级网络,800+ 节点让玩家畅享稳定而极速的体验
    专业网络接入复用 QQ 接入部署和调度策略,有效解决弱网络环境下的连通问题,连通率高达 99.995%
    超强服务承载承载 QQ 服务支撑能力,支持亿级用户在线,亿级群数规模;实时监控,异地容灾,智能调度,保证服务安全可靠
    超低接入门槛通用游戏框架全覆盖,四行代码极速接入
    功能完善全面提供游戏场景常用功能:多人语音、实时视频、语音消息、语音转文本等多种功能

    GME 超低接入门槛

    为方便开发者接入腾讯云游戏多媒体引擎产品,这里向您介绍适用于游戏多媒体引擎 SDK 的接入指引。

    使用 GME 有以下五个步骤:

    1. 在腾讯云后台新建 GME 服务;
    2. 下载对应版本的客户端 SDK;
    3. 参照接入 API 文档, 将 SDK 移植到工程;
    4. 查看日常运营后台统计;
    5. 接入过程中特殊问题自主排除与反馈;

    接入 SDK

    接入 SDK 需要使用腾讯云提供的 appid 及相关权限密钥。即应用管理列表中的 AppID 及 应用设置中的鉴权信息模块。

    • 接入实时语音时候会使用鉴权信息模块中的权限密钥。
    • 接入离线语音时候会使用鉴权信息模块中的下载的公私钥。

    更多平台相关配置请参考各平台工程配置文档。

    img

    GME 应用场景

    电子竞技

    在电子竞技类游戏中,争斗局势瞬息万变,相同阵营的玩家之间,需要根据战局实时沟通对敌策略。通过腾讯云实现的超低时延、流畅优先的实时游戏语音自由对讲,可以帮助玩家间更好的进行沟通,体会对战游戏的乐趣。

    国战游戏

    国战游戏中的典型代表为 MMORPG,此类游戏中涉及团队副本、组队、帮派、国战指挥等多种玩法,对语音的时延要求也较高,腾讯云游戏多媒体引擎针对此类场景,实现实时自动上下麦及超低时延语音通话,高度适配超多人在线的国战类游戏玩家语音通话需求。

    img

    休闲游戏

    在棋牌、K 歌、音乐等休闲类的游戏中,语音消息与语音对讲也是必不可少的需求,同时,部分休闲类游戏中,会有美女主播为玩家播放歌曲,或者通过歌曲伴奏进行 K 歌游戏。腾讯云提供的实时音视频能力保证了好友之间实时聊天沟通,同时提供包括耳返、变声的趣味化能力,保证最佳的休闲游戏体验。

    狼人杀

    目前,桌游类游戏狼人杀已经从传统的饭局延伸到了互联网,在狼人杀游戏中,玩家在开始前热场寒暄,在进行中按顺序发言,在结束后,盘点和回顾,这些环节,都离不开实时语音乃至视频的交互。腾讯云游戏多媒体引擎产品提供画面清晰度与音质优先的实时音视频服务,针对狼人杀场景特别定制,满足玩家所有音视频交互需求。

    img

    基于语音的游戏内创新娱乐玩法

    GME 支持基于位置的3D实时语音

    2017年一款游戏《绝地求生:大逃杀》,通过创新的百人大逃杀、胜者吃鸡玩法,短时间获得了全球玩家的青睐和追捧。除了游戏玩法本身的创意之外,游戏对于实时语音玩法也进行了颠覆式创新。游戏过程中玩家可以设置【全体模式】向附近的玩家喊话、挑衅、搭讪,这种语音模式可以与陌生人进行很有趣的沟通和互动。社交媒体上已经有很多用户基于这种语音模式,创作了很多趣味视频。

    而引入3D位置语音之后,玩家在喊话过程中会暴露自己的方位和位置信息,玩家的声音也会根据位置变化而实时改变。可以说,3D音效让《大逃杀》这种玩家间的沟通和战斗体验更真实,感受更加沉浸式、更加身临其境的吃鸡玩法。

    我们的3D音效技术,就是利用“头部关联传输函数”(HRTF 算法),对双耳之间的时间差异和频谱差异进行建模,形成有声源方位感的声音。同时我们还通过采样混响填补HRIR缺失的环境反射声,从而构建完整的声场模型。比如在一个小房间里,不仅可以听到两个人之间的对话,还可以听到声音从墙壁中反射的效果,增加沉浸感。

    img

    GME 支持游戏内K歌体验,提供变声趣味玩法

    《QQ炫舞》手游由端游原班人马打造,产品的核心体验与端游版本一致。此外,《QQ炫舞》手游还推出了弹珠模式、游戏内实时K歌房等多种独创玩法。然而在创新的同时也带来了一些音频技术上的难题:比如K歌时人声、伴奏与歌词的对齐,K歌场景下多人同时语音时,如何做到声音清晰且避免回音等。

    游戏语音多应用在实时语音、多人会话、发送语音消息等场景,而《QQ炫舞》手游的实时K歌玩法在音频处理上的复杂度上远远超出了正常范畴。正常情况下,玩家在K歌过程中,是听到伴奏之后再演唱,声音由麦克风收录后再输出。但由于游戏场景中系统采集播放模块存在延时,尤其是Android系统机型多、采集播放延时大等因素的影响,如果仅按照正常模式来进行合成,会出现明显的人声、伴奏和歌词不对齐的情况。一旦出现这种情况,再美妙的天籁歌声也会变成“车祸现场”,给玩家带来非常糟糕的游戏体验。

    这些技术难题对于《QQ炫舞》手游来说,无疑是一项重量级挑战。腾讯音视频实验室提供的游戏多媒体引擎GME(Game Multimedia Engine)作为游戏内K歌玩法和多人实时语音的解决方案,使得《QQ炫舞》手游呈现出的效果超乎预期:

    img

    凭借语音效果好、接入门槛低的方案特点,GME覆盖了休闲社交类、MOBA类、MMORPG等多种游戏类型,提供实时语音、语音消息、语音转文本等功能。如今,通过针对游戏类型、游戏场景的深度优化,GME积累了深厚的技术底蕴,同时通过覆盖超过400+游戏产品的技术支持,不断积累技术经验,为玩家打造畅爽的游戏语音体验,展示了领先业内的技术实力。

    游戏多媒体引擎 GME产品概述:https://cloud.tencent.com/document/product/607/10835

    游戏多媒体引擎 GME接入指引:https://cloud.tencent.com/document/product/607/10782

    游戏多媒体引擎 GME SDK文档:https://cloud.tencent.com/document/product/607/15232

    问答

    腾讯云服务器?

    相关阅读

    游戏人工智能 读书笔记(十一)游戏内容生成

    游戏人工智能 读书笔记(八)游戏与强化学习

    游戏人工智能 读书笔记 (七) 游戏与监督学习

    此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/developer/article/1157948?fromSource=waitui

    欢迎大家前往腾讯云+社区或关注云加社区微信公众号(QcloudCommunity),第一时间获取更多海量技术实践干货哦~

    海量技术实践经验,尽在云加社区! https://cloud.tencent.com/developer?fromSource=waitui

    展开全文
  • 转码多媒体云盘系统
  • 采用混合既可以发挥外部公共的优势,同时又可以借助内部私有依据自身特点对现有资源进行整合.研究混合模式下高校多媒体网关设计,用于实现内部信息资源的整合与外部公共跨平台、跨应用程序的无缝连接管理...
  • 云端资播控系统网络安全设计.pdf
  • 技术联合多媒体技术的教学模式分析 21世纪以来我国经济迅速发展科学技术日新月异计算机 技术和信息技术的广泛运用使人们的生活和工作方式都发生了 翻天覆地的变化近年来技术这一新兴的技术受到社会各 界的广泛...
  • 智慧教育录播教室、多媒体教室平台整体解决方案
  • 基于博弈论的多媒体资源分配策略
  • 久远多媒体教学平台 商业计划书 浙江久远教育软件开发有限公司 * 总结 * 使命 为浙江中小学提供价廉物美的简单好用的私有平台产品 技术 根据浙江中小学的教学特点和教学要求在通用的私有平台上进行深度定制...
  • 互联网传媒行业周观点:腾讯推出互动游戏方案,梯7月环比继续改善.pdf
  • PAGE1 / NUMPAGES8 久远多媒体教育平台 解决方案 Version 1.0 TIME \@ "yyyy'年'M'月'd'日" 2013年3月7日 TOC \o "1-3" \h \z \u 一顶层设计思路 2 1.1义务教育市场基本面分析 2 需求分析 2 采购模式的转变 2 1.2...
  • 与中国网友更多去关注“阿里手机好卖不好卖、好不好用”不同,国外科技网站更关注的是阿里手机背后的移动操作系统。发表的短评标题是“Android和iOS小心了,阿里操作系统来了”,而另一科技网站businesswire...
     
    

    与中国网友更多去关注“阿里云手机好卖不好卖、好不好用”不同,国外科技网站更关注的是阿里云手机背后的移动云操作系统。发表的短评标题是“Android和iOS小心了,阿里云操作系统来了”,而另一科技网站businesswire则参加了昨天阿里在北京的发布会,对云操作系统进行了进一步分析,全文如下:

    阿里巴巴集团的子公司,先进的以数据为中心的云计算服务开发商——阿里云计算(简称“阿里云”),近日推出了其内部开发的基于云的移动设备操作系统,“阿里云操作系统”。K-Touch的云智能手机W700是第一款云操作系统的手机今天也同时面世,并将于7月底向中国市场推出。阿里云还计划在未来几个月内与其他设备进行整合,包括具有更大的屏幕的手机和平板电脑。

    “手机用户希望使用更加开放,便捷的手机操作系统,一个可以让他们真正享受到在掌上浏览互联网的乐趣,而这款云操作系统,以其基于云的应用程序将能很好的满足这种需求,” 阿里巴巴云计算的总裁王健说:“将云程序应用到移动设备,不仅带来了全新的用户体验,同时也更易于第三方移动软件开发人员将能够使用到如HTML5和JavaScript等互联网技术,以减少在应用程序开发过程中的复杂性。”

    这款云操作系统将包括多项云服务,包括电子邮件,互联网搜索,天气预报,地图及GPS导航工具。云操作系统的一个显著特点是它支持基于Web的应用程序。这些都为用户提供了类互联网的体验,并且不需要用户在移动设备上下载或安装应用软件。云操作系统用户可以诸如联系信息,通话记录,短信,注意事项和照片等等信息无缝同步,存储和备份到阿里云的远程数据中心,也可以在任何电脑和移动设备上访问和更新数据。最开始,阿里云将为每个用户提供100G的存储空间,而且还将根据需要进行调整。

    第三方软件开发人员可以选择在自己的服务器上开发云应用程序,也可以选择使用阿里云设备和开放的平台以较低的成本快速发展自己的业务。云操作系统是花费了3年时间,使用阿里云自主研发的分布式文件系统和虚拟机开发的成果,而且云操作系统可以与基于Android的应用程序完全兼容。

    据工业和信息化部的最新统计,中国3G移动用户数量目前已经超过八千万,约占全国手机用户的9.5%。根据咨询公司易观国际数据显示,2010年智能手机销量达到6,200万,而2011年第一季的销量就达到了1,907万部,占所有手机销量约30%。

    展开全文
  • 为了研究媒体和官的传播新闻《武汉快递小哥汪勇的先进事迹》的及时性和传播力度,对比两种传播途径的差异,并给出新闻传播随时间的基本规律。本文通过爬取微博针对某一问题进行数据爬取,进行数据分析对比。 2....

    创作不易,如果以下内容对你有帮助,别忘了点一个赞,让更多的小伙伴能看到吧~~


    1. 问题描述

    • 为了研究自媒体和官媒的传播新闻《武汉快递小哥汪勇的先进事迹》的及时性和传播力度,对比两种传播途径的差异,并给出新闻传播随时间的基本规律。本文通过爬取微博针对某一问题进行数据爬取,进行数据分析对比。

    2. 数据获取

    • 主要利用python的requests库和etree库对数据进行爬取和提取并整理,以下附上爬取的部分代码:
    # 数据爬取
    def start_crawl(base_url,month,number):
       for i in range(2,month):
           for j in range(1,number):
               headers = request_header()
               url = base_url.format(i,i+1,j)
               time.sleep(0.5)
               response = requests.get(url=url, headers=headers)
               res = etree.HTML(response.text)
               yield res
    
    
    # 数据获取并清洗
    def data_clean(base_url,month,number):
        res = start_crawl(base_url,month,number)
        data = []
        for html in res:
            div_list = html.xpath('//div[@class="content"]')
            for div in div_list:
                info = []
                name = div.xpath('./div[@class="info"]//a[@class="name"]/text()')
                content = div.xpath('./p[@class="txt"]//text()')
                time = div.xpath('./p[@class="from"]/a[1]/text()')
                name = name[0] if len(name) > 0 else None
                time = time[0].strip() if len(time) > 0 else None
                content = ''.join([i.strip() for i in content])
                info.append(name)
                info.append(time)
                info.append(content)
                if info[0] is not None and info[1] is not None:
                    data.append(info)
        return data
    
    • 附上一张元素审查时的经典图:
      在这里插入图片描述

    • 以下附上部分数据表:
      在这里插入图片描述

    3. 数据整理并可视化

    • 作出两种媒体整体热度趋向图
    data = data.loc[data['发布时间'].str.contains('今天') == False,:]   # 去除干扰
    data.index = np.arange(len(data))
    # 取出月份
    data["发布时间"] = data["发布时间"].apply(lambda x: x[:3])
    # 对发布时间进行分层聚合处理
    time_count = data.groupby(by="发布时间").count()
    
    # 画图
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    plt.plot(time_count.index,time_count.values.ravel(),"-g")
    plt.title("随时间的热度走向图")
    plt.xlabel("时间(月份)")
    plt.ylabel("发布量(个)")
    plt.show()
    

    在这里插入图片描述

    plt.bar(x=time_count.index,height=time_count.values.ravel(),align='center',color="g")
    plt.title("随时间的热度走向图")
    plt.xlabel("时间(月份)")
    plt.ylabel("发布量(个)")
    plt.show()
    

    在这里插入图片描述

    • 作出官媒和自媒体各自热度占比图
    # 自定义官媒名称
    OMN = ["青岛文明网","880山西交通广播","楚天交通广播","央视影音","抚州南丰发布",\
           "珠江商报","云南日报","国家邮政局","中国青年报","武汉晚报","长江日报",\
           "新都资讯","成都少先队","成都发布","潍坊政法","杭锦发布","四川党的建设杂志",\
           "法治日报","中国舆论场","苏州发布","新浪辽宁","山西经济广播","山西共青团",\
           "北京朝阳","江西共青团","包头新闻网","鄂尔多斯发布","羊城晚报","保定发布",\
           "陇南礼县发布","中国残联","人民日报全国党媒平台","四川文明网","内蒙古团委",\
           "武汉广播电视台","湖北卫视","潍坊市人民检察院","湖北省妇联","湖北日报",\
           "人民日报","江西卫视根据地","陕西新闻广播","南京晨报","今晚报","广东共青团",\
           "南昌日报","河北综合广播","陕西都市快报","楚天交通广播","陕西新广","青海网",\
           "山东卫视","渭南日报社","国家应急广播","央视新闻","罗湖共青团","内蒙古团委",\
           "三秦青年","共青团青岛市委","中国共青团杂志","重庆共青团","延安青年","共青团中央",\
           "西藏共青团","大同共青团","中国青年报","黑龙江晨报","国家邮政局","四川共青团",\
           "合肥日报","陕西日报","南京晨报","中国新闻网","江苏共青团","共青团南川区","惠州共青团",\
           "人民法院报","天津日报","青海共青团","广西卫视","贺州共青团","共青团包头市委员会",\
           "西藏共青团","武汉发布","中国网","山西政法","云南网","吉林人民广播电台"
          ]
          
    OM = []
    for name in data["媒体名"]:
        if name in OMN:
            count += 1
            OM.append(name)
    OM = pd.Series(OM)
    
    PM = []
    for name in data["媒体名"]:
        if name not in OMN:
            count += 1
            PM.append(name)
    PM = pd.Series(PM)
    
    plt.figure(figsize=(10,8))
    x = (OM.size,PM.size)
    labels = ["官媒","自媒体"]
    plt.pie(x=x,labels=labels,colors=['red','c'],autopct='%.1f%%',pctdistance=0.5,labeldistance=1.2,radius=1.2,explode=[0,0.1],\
            wedgeprops={'linewidth':1.5,'edgecolor':'green'},textprops={'fontsize':10,'color':'black'})
    plt.title("官媒和自媒体占比图")
    plt.show()
    

    在这里插入图片描述

    • 作出官媒和自媒体各自热度图
    
    # 分别切分出官媒的数据和自媒体数据
    OM_data = data_.loc[data_['媒体名'].isin(OM)]
    PM_data = data_.loc[~data_['媒体名'].isin(OM)]
    # 对两种媒体分别进行分层聚合
    om_plot = OM_data.groupby(by="发布时间").count()
    pm_plot = PM_data_.groupby(by="发布时间").count()
    
    # 画图
    plt.figure(figsize=(10,8))
    ax = plt.subplot(111)
    ax.plot(om_plot.index,om_plot.values,linewidth=3,label="官媒")
    ax.plot(pm_plot.index,pm_plot.values,linewidth=3,label="自媒体")
    plt.title("官媒和自媒体随时间的热度走向图")
    plt.xlabel("时间(月份)")
    plt.ylabel("发布量(个)")
    plt.legend(loc="best")
    plt.show()
    

    在这里插入图片描述

    • 画出2月~3月新闻初期的传播规律图
    # 获取2月~3月的日期
    data_["发布时间"] = data_["发布时间"].apply(lambda x: x[:6])
    data_1 = data_.loc[data_["发布时间"].str.contains("02月")]
    data_2 = data_.loc[data_["发布时间"].str.contains("03月")]
    data_ = pd.concat([data_1,data_2],axis=0)
    data_.index = np.arange(len(data_))
    
    # 取出官媒和自媒体各自数据
    OM_data_ = data_.loc[data_['媒体名'].isin(OM)]
    PM_data_ = data_.loc[~data_['媒体名'].isin(OM)]
    
    # 分别对其分层聚合处理
    om_plot_ = OM_data_.groupby(by="发布时间").count()
    pm_plot_ = PM_data_.groupby(by="发布时间").count()
    
    # 画图
    plt.figure(figsize=(15,5))
    ax = plt.subplot(121)
    ax.plot(om_plot_.index,om_plot_.values,linewidth=3,label="官媒")
    plt.title("2月~3月官媒随时间的热度走向图")
    plt.xlabel("时间(天数)")
    plt.ylabel("发布量(个)")
    plt.legend(loc="best")
    
    ax_2 = plt.subplot(122)
    ax_2.plot(pm_plot_.index,pm_plot_.values,linewidth=3,label="自媒体")
    plt.title("2月~3月自媒体随时间的热度走向图")
    plt.xlabel("时间(天数)")
    plt.ylabel("发布量(个)")
    plt.xticks([])
    plt.legend(loc="best")
    plt.show()
    

    在这里插入图片描述

    4.云词图

    • 附部分代码
    data_ = pd.read_excel('C:/Users/雷神/Desktop/wy.xlsx',sheet_name=0,index_col=0)
    data_ = data_.loc[data_['发布时间'].str.contains('今天') == False,:]   # 去除干扰
    article = data_["文章"]
    text = []
    for a in article:
        text.append(a)
    text = ",".join(str(i) for i in text)
    
    # 将字符串切分为单个字符
    def chinese_jieba(text):
        wordlist_jieba=jieba.cut(text,cut_all=True)
        space_wordlist='/'.join(wordlist_jieba)
        return  space_wordlist
        
    # 绘制词云图
    with open("F:/wangyong/article.txt",encoding="utf-8") as f:
        text = f.read()
        text = chinese_jieba(text)
        image = PIL.Image.open('F:/wangyong/bg2.jpg')
        MASK = np.array(image)
        wordcloud = WordCloud(font_path="‪C:\\Windows\\Fonts\\simkai.ttf",\
                              background_color="white", width=800, \
                              repeat=False, mask=MASK,\
                              height=500, max_words=180,min_font_size=8).generate(text)
        #img = wordcloud.to_image()
        #img.show()
        wordcloud.to_file('F:/wangyong/wordcloud.png')
        plt.figure(figsize=(10,8),dpi=100)
        plt.imshow(wordcloud)
        plt.axis('off')
        plt.show()
    
    • 图像展示
      在这里插入图片描述

    结语

    • 可以看出:
      1. 自媒体明显比官媒的传播路径广,可以初步认为自媒体时代已经到来。
      2. 新闻在传播初期,新闻传播得极快,在中期新闻量会有一个饱和,接着就是骤减,后期可能因为新闻出现新的改变,还会有一个小高峰。
    展开全文
  • 行业分类-设备装置-安全多媒体存储中基于格的多用户模糊可搜索加密方法.zip
  • “网红”情深“”为——杭州市电子信息职业学校教师宣琪二三事
  • 阿里OSS视频文件迁移视频点播,并导出资excel表一 介绍1 OSS 是什么2 视频点播是什么3 制作背景阿里磁盘(读文件)阿里点播(写文件)阿里sdk导入依赖二 流程1 迁移流程注意:解释:三 代码实现1 ...

    一 介绍

    1 OSS 是什么

    OSS 相当于硬盘、便宜容量大,存储不经常使用的文件。
    官网介绍: https://help.aliyun.com/document_detail/31817.html?spm=a2c4g.11174359.6.544.51ea1ea9aXOD2K
    

    2 视频点播是什么

    视频点播相当于存储视频文件的CND,集鉴权、播放、管理于一体的播放系统。
    官网介绍: https://help.aliyun.com/document_detail/51236.html?spm=a2c4g.11186623.6.542.1b97152aQrphzw
    

    3 制作背景

    与阿里云合作,视频媒资量过于巨大,无法通过阿里云平台上传,只能通过寄OSS硬盘拷贝,然后将OSS寄回阿里,编写OSS迁移到视频点播的代码上传即可。
    文档信息
    

    阿里云磁盘(读文件)

     				读文件: https://help.aliyun.com/video_detail/39691.html?spm=5176.10695662.1996646101.searchclickresult.2f2d36b9m7F1K4
    

    阿里云点播(写文件)

    				写文件: https://help.aliyun.com/document_detail/64148.html?spm=a2c4g.11186623.6.1066.42976a58M4A9av」
    

    阿里云sdk导入依赖

           <!-- 阿里云同步开始 -->
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-core</artifactId>
                <version>4.3.3</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.1.0</version>
            </dependency>
            <dependency>
                <groupId>com.aliyun</groupId>
                <artifactId>aliyun-java-sdk-vod</artifactId>
                <version>2.15.2</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.28</version>
            </dependency>
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>20170516</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.konka.util</groupId>
                <artifactId>aliyun-java-vod-upload</artifactId>
                <version>1.4.12</version>
            </dependency>
    
            <!-- 阿里云同步结束 -->
    
            <!-- excel处理 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
            </dependency>
    

    二 流程

    1 迁移流程

    在这里插入图片描述

    注意:

    1 确保OSS和视频点播和ECS(自己的云机器)在一个局域网内、走内网不消耗网络流量。

    解释:

    1 将OSS文件批量查询、并下载到本地ECS服务器
    2 将本地下载好的文件上传视频点播(注意配置好转码模板、分类信息等)

    三 代码实现

    1 UploadVideoServiceImpl业务代码

    
    @Slf4j
    @Service
    public class UploadVideoServiceImpl implements UploadVideoService {
    
        public final static List<Suplier> suplierlist = new ArrayList() {{
            add(new Suplier("shulang", "供应商1", 8L));
            add(new Suplier("jiaoyu", "供应商2", 19L));
            add(new Suplier("huanggang", "供应商3", 6020L));
            add(new Suplier("yang", "供应商4", 21L));
    
        }};
    
        @Override
        public void upload(ABInDTO inDTO) {
    
            Integer start = inDTO.getStart();
            Integer end = inDTO.getEnd();
            // 1 赛选所有
            List<OSSObjectSummary> finds = OSSUploadVideoDemo.select();
            log.info("查询总数为:{}", finds.size());
    
            if (start == null) {
                start = 0;
            }
            if (end == null) {
                end = finds.size();
            }
            log.info("开始和结束的数量start:{},end:{}", start, end);
            Integer count = 0;
            // 2 遍历上传到视频点播
            for (int i = 0; i < finds.size(); i++) {
                // 过滤掉
                if (start <= i && end >= i) {
                    log.info("开始第:{}个-区间共:{}-{}个,总共:{}", i, start, end, finds.size());
    
                    OSSObjectSummary s = finds.get(i);
                    try {
                        // 3 上传视频点播
                        log.info("\t-----------------------start");
                        log.info("\tgetKey " + s.getKey());
                        OSSUploadVideoDemo.upload(s.getKey());
                        log.info("\t上传视频点播完毕getBucketName " + s.getBucketName());
                    } catch (Exception e) {
                        log.error("上传视频点播出错了1");
                        log.info("\tgetKey " + s.getKey());
                    }
                    count++;
                    log.info("\t-----------------------end");
                }
            }
    
        }
    
        public static void main(String[] args) throws Exception {
            OSSUploadVideoDemo.upload(null);
        }
    
    }
    
    
    

    2 Suplier供应商表

    @Data
    public class Suplier {
    
        // OSS文件夹名称***
        private String bucketName;
    
        private String nickName;    // 备注名称
    
        private Long CateId;    // 分类id
    
        public Suplier(String bucketName, String nickName, Long cateId) {
            this.bucketName = bucketName;
            this.nickName = nickName;
            CateId = cateId;
        }
    }
    
    
    

    3 OSS处理工具类OSSUploadVideoDemo

    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClient;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.model.*;
    import com.aliyun.vod.upload.resp.UploadVideoResponse;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.vod.model.v20170321.*;
    import com.operlog.main.model.po.Suplier;
    import com.operlog.main.utils.JavaExcelUtils;
    import com.operlog.main.utils.JavaListUtils;
    import com.operlog.utils.log.service.impl.UploadVideoServiceImpl;
    import lombok.extern.slf4j.Slf4j;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.text.ParseException;
    import java.util.ArrayList;
    import java.util.List;
    
    
    /**
     * Created by ji
     * ji on 2020/4/28.
     * 阿里云OSS视频下载
     * https://help.aliyun.com/document_detail/84824.html?spm=a2c4g.11186623.6.800.45466328mEu67v
     */
    @Slf4j
    public class OSSUploadVideoDemo {
    
        //账号AK信息请填写(必选) 子账号
        public static final String accessKeyId = "";
    
        //账号AK信息请填写(必选)
        public static final String accessKeySecret = "";
    
        // Bucket名称
        public static final String bucketName = "kkypf-yixue-media";
    
        //        public static final String localUrl = "G:\\office\\test\\";   // 本地
        public static final String localUrl = "/alidata/server/test/";   // 线上???
    
        // Endpoint以上海为例,其它Region请按实际情况填写。
    //    public static final String endpoint = "http://oss-cn-shanghai.aliyuncs.com";    // 外网
        public static final String endpoint = "http://oss-cn-shanghai-internal.aliyuncs.com";    // 内网 -UploadVideoDemo-  request.setApiRegionId("cn-shanghai"); request.setEcsRegionId("cn-shanghai");  要开放
    //    public static final String uploadEndpoint = "http://oss-cn-shanghai-internal.aliyuncs.com";    // 视频点播内网
    
        /**
         * 查询路径下所有文件
         */
        public static List<OSSObjectSummary> select() {
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            final int maxKeys = 1000;
            String nextMarker = null;
            ObjectListing objectListing;
            Long count = 0l;
            List<OSSObjectSummary> sumsOut = new ArrayList<>();
            do {
                objectListing = ossClient.listObjects(new ListObjectsRequest(bucketName).withMarker(nextMarker).withMaxKeys(maxKeys));
    
                List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
                sumsOut.addAll(sums);
                count += sums.size();
                log.info("最大个数\t" + sums.size());
                nextMarker = objectListing.getNextMarker();
            } while (objectListing.isTruncated());
    
            // 关闭OSSClient。
            ossClient.shutdown();
            log.info("总数为\t" + count);
            return sumsOut;
        }
    
        /**
         * OSS下载视频
         *
         * @param objectName 文件的目标名 例如: lang/人教版3年级下册(3起)-第100讲:Unit 2 My family.mp4
         */
        public static void upload(String objectName) throws Exception {
    
            log.info("上传开始objectName:{}", objectName);
            // 1 OSS下载文件到本地
            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
            String[] split = objectName.split("/");
            // 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
            String fileNameReal = split[split.length - 1];
            String fileName = localUrl + fileNameReal;  
            log.info("fileName:{}", fileName);
            File file = new File(fileName);
            try {
                BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
            } catch (Exception e) {
                log.error("下载OSS出错了2objectName:{},msg:{}", objectName, e.getMessage());
            }
            ObjectMetadata object = ossClient.getObject(new GetObjectRequest(bucketName, objectName), file);
    
            // 关闭OSSClient。
            ossClient.shutdown();
            log.info("object.getCacheControl():{}", object.getCacheControl());
            log.info("object.getContentDisposition():{}", object.getContentDisposition());
            log.info("object.getContentEncoding():{}", object.getContentEncoding());
            log.info("object.getContentMD5():{}", object.getContentMD5());
            log.info("object.getETag():{}", object.getETag());
            log.info("object.getRequestId():{}", object.getRequestId());
            log.info("object.getServerSideEncryption():{}", object.getServerSideEncryption());
            log.info("object():{}", object.toString());
    
            // 筛选出是哪个供应商
            Suplier suplierOut = new Suplier("新建分类zj默认1", "新建分类zj默认1", 1000136023L);
            for (Suplier suplier : UploadVideoServiceImpl.suplierlist) {
                if (objectName.contains(suplier.getBucketName())) {
                    suplierOut = suplier;
                    log.info("objectName:{},属于:{}", objectName, suplier.getNickName());
                    break;
                }
            }
            // 2 本地上传到视频点播
    //        UploadVideoResponse uploadVideoResponse = UploadVideoDemo.testUploadVideo(accessKeyId, accessKeySecret, fileNameReal.substring(0, fileNameReal.lastIndexOf(".")), fileName);
            UploadVideoResponse uploadVideoResponse = UploadVideoDemo.testUploadVideo(accessKeyId, accessKeySecret, fileNameReal, fileName, suplierOut.getCateId());
            log.info("RequestId=" + uploadVideoResponse.getRequestId() + "\n");
            log.info("VideoId=" + uploadVideoResponse.getVideoId() + "\n");
            log.info("ErrorCode=" + uploadVideoResponse.getCode() + "\n");
            log.info("ErrorMessage=" + uploadVideoResponse.getMessage() + "\n");
            String[] stringOuts = null;
            // 将文件写入表格中    String[] strings = {"1 第三方介质ID", "2 介质名称", "3 介质格式", "4 播放时长 (秒)", "5 分辨率", "6 播放地址", "7 requestId", "8 videoId", "9 code", "10 message", "11 供应商名称", "12 阿里云分类catId"};
            if (uploadVideoResponse == null) {
                stringOuts = new String[]{"", fileNameReal.substring(0, fileNameReal.lastIndexOf(".")),
                        fileNameReal.substring(fileNameReal.lastIndexOf("."), fileNameReal.length()), "4",
                        "5", "6",
                        "7", "8",
                        "9", "返回空指针"};
            } else {
                // 获取视频信息
                GetVideoInfoResponse videoInfo = null; //
                GetMezzanineInfoResponse mezzanineInfo = null;
                String str4 = null;
                String str5 = "1280*720";   // 默认
                String str6 = "";
                try {
                    videoInfo = getVideoInfo(uploadVideoResponse.getVideoId());
                    log.info("获取视频信息结束:{},videoInfo:{}", uploadVideoResponse.getVideoId(), videoInfo);
                    GetVideoInfoResponse.Video video = videoInfo.getVideo();
                    log.info("获取视频信息结束:{},videoInfo:{},video:{}", uploadVideoResponse.getVideoId(), videoInfo, video);
                    str4 = video.getDuration() + "";
                    str6 = video.getCoverURL();
                    mezzanineInfo = getMezzanineInfo(uploadVideoResponse.getVideoId());
                    log.info("查询到视频信息videoId:{},mezzanineInfo:{}", uploadVideoResponse.getVideoId(), mezzanineInfo);
                    GetMezzanineInfoResponse.Mezzanine mezzanine = mezzanineInfo.getMezzanine();
                    GetMezzanineInfoResponse.Mezzanine.VideoStream videoStream = mezzanine.getVideoStreamList().get(mezzanine.getVideoStreamList().size() - 1);
    //                str5 = mezzanine.getHeight() + "*" + mezzanine.getWidth();
                    str5 = videoStream.getHeight() + "*" + videoStream.getWidth();
                } catch (Exception e) {
                    log.error("下载OSS出错了3objectName:{},msg:{}", objectName, e.getMessage());
                }
                stringOuts = new String[]{uploadVideoResponse.getVideoId(), fileNameReal.substring(0, fileNameReal.lastIndexOf(".")),
                        fileNameReal.substring(fileNameReal.lastIndexOf(".") + 1, fileNameReal.length()), str4,
                        str5, str6,
                        uploadVideoResponse.getRequestId(), uploadVideoResponse.getVideoId(),
                        uploadVideoResponse.getCode(), uploadVideoResponse.getMessage()};
            }
            // 3 将信息汇总-写入excel
            try {
                log.info("写入excel开始objectName:{}", objectName);
                List<String[]> list1 = new ArrayList<String[]>();
                list1.add(stringOuts);
                JavaExcelUtils.addOneLine(list1, JavaExcelUtils.TableName.YIXUE);
                log.info("写入excel完毕objectName:{},stringOuts:{}", objectName, stringOuts);
            } catch (Exception e) {
                log.error("写入excel出错了4objectName:{},list1:{},msg:{}", objectName, stringOuts, e.getMessage());
            }
            log.info("上传完毕objectName:{}", objectName);
            log.info("写入excel完毕stringOuts:{}", stringOuts.toString());
        }
    
    
        /**
         * OSS下载视频
         *
         * @param suplier 供应商
         */
        public static void getPalyInfoToExcel(Suplier suplier) throws Exception {
    
            log.info("getPalyInfoToExcel开始suplier:{}", suplier);
            Long catId = suplier.getCateId();
            // 1 获取分类下面的所有视频
            List<GetVideoListResponse.Video> videoListAll = null;
            try {
                videoListAll = UploadVideoDemo.getVideoListAll(catId);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (JavaListUtils.isEmpty(videoListAll)) {
                System.out.println("videoListAll.size():0");
                return;
            }
            System.out.println("videoListAll.size():" + videoListAll.size());
            // 2 获取视频详情
            List<GetPlayInfoResponse> getPlayInfoResponses = new ArrayList<>();
            for (GetVideoListResponse.Video video : videoListAll) {
                try {
                    GetPlayInfoResponse playInfo = OSSUploadVideoDemo.getPlayInfo(video.getVideoId());
                    getPlayInfoResponses.add(playInfo);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (JavaListUtils.isEmpty(getPlayInfoResponses)) {
                System.out.println("getPlayInfoResponses.size():0");
                return;
            }
            // 3 遍历写入excel
            for (GetPlayInfoResponse getPlayInfoRespons : getPlayInfoResponses) {
                String[] stringOuts = null;
                // 将文件写入表格中  String[] strings = {"1 第三方介质ID", "2 介质名称", "3 介质格式", "4 播放时长 (秒)", "5 分辨率", "6 播放地址", "7 requestId", "8 videoId", "9 code", "10 message"};
                if (getPlayInfoRespons == null) {
                    stringOuts = new String[]{"1", "2",
                            "3", "4",
                            "5", "6",
                            "7", "8",
                            "9", "10"};
                } else {
                    String str3 = "m3u8";
                    String str5 = "1280*720";   // 默认
                    String str6 = "";
                    GetPlayInfoResponse.VideoBase videoBase = getPlayInfoRespons.getVideoBase();
                    List<GetPlayInfoResponse.PlayInfo> playInfoList = getPlayInfoRespons.getPlayInfoList();
                    if (!JavaListUtils.isEmpty(playInfoList)) {
                        GetPlayInfoResponse.PlayInfo playInfo = playInfoList.get(0); // 取第一个
                        str3 = playInfo.getFormat();
                        str5 = playInfo.getWidth() + "*" + playInfo.getHeight();
                        str6 = playInfo.getPlayURL();
                    }
    
                    stringOuts = new String[]{videoBase.getVideoId(), videoBase.getTitle(),
                            str3, videoBase.getDuration(),
                            str5, str6,
                            getPlayInfoRespons.getRequestId(), videoBase.getVideoId(),
                            videoBase.getStatus(), videoBase.getCreationTime(),
                            suplier.getNickName(), catId + ""};
                }
                // 3 将信息汇总-写入excel
                try {
                    log.info("写入excel开始objectName:{}", catId);
                    List<String[]> list1 = new ArrayList<String[]>();
                    list1.add(stringOuts);
                    JavaExcelUtils.addOneLine(list1, JavaExcelUtils.TableName.YIXUE);
                    log.info("写入excel完毕objectName:{},stringOuts:{}", catId, stringOuts);
                } catch (Exception e) {
                    log.error("写入excel出错了4objectName:{},list1:{},msg:{}", catId, stringOuts, e.getMessage());
                }
                log.info("getPalyInfoToExcel完毕objectName:{}", catId);
                log.info("getPalyInfoToExcel写入excel完毕stringOuts:{}", stringOuts.toString());
    
            }
            log.info("getPalyInfoToExcel写入excel完毕stringOuts:{}");
        }
    
        /**
         * 获取源文件信息
         *
         * @return GetMezzanineInfoResponse 获取源文件信息响应数据
         * @throws Exception
         */
        public static GetMezzanineInfoResponse getMezzanineInfo(String videoId) throws Exception {
            log.info("查询videoId:{}", videoId);
            GetMezzanineInfoRequest request = new GetMezzanineInfoRequest();
            DefaultAcsClient client = initVodClient(accessKeyId, accessKeySecret);  // 发送请求客户端
    
            request.setVideoId(videoId);
            //源片下载地址过期时间
            request.setAuthTimeout(3600L);
            return client.getAcsResponse(request);
        }
    
    
        /**
         * 初始化 点播视频查询
         *
         * @param accessKeyId
         * @param accessKeySecret
         * @return
         * @throws ClientException
         */
        public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
            String regionId = "cn-shanghai";  // 点播服务接入区域
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            return client;
        }
    
        /**
         * 获取视频信息
         *
         * @return GetVideoInfoResponse 获取视频信息响应数据
         * @throws Exception
         */
        public static GetVideoInfoResponse getVideoInfo(String videoId) throws Exception {
    
            log.info("获取视频信息开始:{}", videoId);
            DefaultAcsClient client = initVodClient(accessKeyId, accessKeySecret);  // 发送请求客户端
    
            GetVideoInfoRequest request = new GetVideoInfoRequest();
            request.setVideoId(videoId);
            return client.getAcsResponse(request);
        }
    
        /*获取播放地址函数*/
    
        /**
         * 转码流地址
         *
         * @param videoId 视频id
         * @return
         * @throws Exception
         */
        public static GetPlayInfoResponse getPlayInfo(String videoId) throws Exception {
    
            DefaultAcsClient client = OSSUploadVideoDemo.initVodClient(OSSUploadVideoDemo.accessKeyId, OSSUploadVideoDemo.accessKeySecret);  // 发送请求客户端
    
            GetPlayInfoRequest request = new GetPlayInfoRequest();
            request.setVideoId(videoId);
            return client.getAcsResponse(request);
        }
    
    
    

    4 视频点播操作UploadVideoDemo

    package com.operlog.main.aliyun;
    
    import com.alibaba.fastjson.JSONObject;
    import com.aliyun.vod.upload.impl.UploadAttachedMediaImpl;
    import com.aliyun.vod.upload.impl.UploadImageImpl;
    import com.aliyun.vod.upload.impl.UploadM3u8FileImpl;
    import com.aliyun.vod.upload.impl.UploadVideoImpl;
    import com.aliyun.vod.upload.req.*;
    import com.aliyun.vod.upload.resp.*;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.vod.model.v20170321.*;
    import com.operlog.main.model.po.Suplier;
    import com.operlog.main.utils.JavaListUtils;
    import com.operlog.utils.log.service.impl.UploadVideoServiceImpl;
    import lombok.extern.slf4j.Slf4j;
    
    import java.io.*;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.List;
    
    
    /**
     * 视频点播工具类
     * 以下Java示例代码演示了如何在服务端上传媒资文件至视频点播,媒资类型支持音频、视频和图片。
     * <p>
     * 一、音视频上传目前支持4种方式上传:
     * <p>
     * 1.上传本地文件,使用分片上传,并支持断点续传,参见testUploadVideo函数。
     * 1.1 当断点续传关闭时,最大支持上传任务执行时间为3000秒,具体可上传文件大小与您的网络带宽及磁盘读写能力有关。
     * 1.2 当断点续传开启时,最大支持48.8TB的单个文件,注意,断点续传开启后,上传任务执行过程中,同时会将当前上传位置写入本地磁盘文件,影响您上传文件的速度,请您根据文件大小选择是否开启
     * <p>
     * 2.上传网络流,可指定文件URL进行上传,支持断点续传,最大支持48.8TB的单个文件。
     * 该上传方式需要先将网络文件下载到本地磁盘,再进行上传,所以要保证本地磁盘有充足的空间。参见testUploadURLStream函数。
     * <p>
     * 3.上传文件流,可指定本地文件进行上传,不支持断点续传,最大支持5GB的单个文件。参见testUploadFileStream函数。
     * <p>
     * 4.流式上传,可指定输入流进行上传,支持文件流和网络流等,不支持断点续传,最大支持5GB的单个文件。参见testUploadStream函数。
     * <p>
     * <p>
     * 二、图片上传目前支持2种方式上传:
     * 1.上传本地文件,不支持断点续传,最大支持5GB的单个文件,参见testUploadImageLocalFile函数
     * 2.上传文件流和网络流,InputStream参数必选,不支持断点续传,最大支持5GB的单个文件。参见testUploadImageStream函数。
     * 注:图片上传完成后,会返回图片ID和图片地址,也可通过GetImageInfo查询图片信息,参见接口文档 https://help.aliyun.com/document_detail/89742.html
     * <p>
     * <p>
     * 三、m3u8文件上传目前支持2种方式:
     * 1.上传本地m3u8音视频文件(包括所有分片文件)到点播,需指定本地m3u8索引文件地址和所有分片地址。
     * 2.上传网络m3u8音视频文件(包括所有分片文件)到点播,需指定m3u8索引文件和分片文件的URL地址。
     * <p>
     * 注:
     * 1) 上传网络m3u8音视频文件时需要保证地址可访问,如果有权限限制,请设置带签名信息的地址,且保证足够长的有效期,防止地址无法访问导致上传失败
     * 2) m3u8文件上传暂不支持进度回调
     * <p>
     * <p>
     * 四、上传进度回调通知:
     * 1.默认上传进度回调函数:视频点播上传SDK内部默认开启上传进度回调函数,输出不同事件通知的日志,您可以设置关闭该上传进度通知及日志输出;
     * 2.自定义上传进度回调函数:您可根据自已的业务场景重新定义不同事件处理的方式,只需要修改上传回调示例函数即可。
     * <p>
     * <p>
     * 五、辅助媒资上传目前支持2种方式:
     * 1.上传本地文件,不支持断点续传,最大支持5GB的单个文件,参见testUploadAttachedMediaLocalFile函数
     * 2.上传文件流和网络流,InputStream参数必选,不支持断点续传,最大支持5GB的单个文件。参见testUploadAttachedMediaStream函数。
     * <p>
     * <p>
     * 六、支持STS方式上传:
     * 1.您需要实现VoDRefreshSTSTokenListener接口的onRefreshSTSToken方法,用于生成STS信息,
     * 当文件上传时间超过STS过期时间时,SDK内部会定期调用此方法刷新您的STS信息进行后续文件的上传。
     * <p>
     * <p>
     * 七、可指定上传脚本部署的ECS区域(设置Request的EcsRegionId参数,取值参考存储区域标识:https://help.aliyun.com/document_detail/98194.html),
     * 如果与点播存储(OSS)区域相同,则自动使用内网上传文件至存储,上传更快且更省公网流量
     * 由于点播API只提供外网域名访问,因此部署上传脚本的ECS服务器必须具有访问外网的权限。
     * <p>
     * 注意:
     * 请替换示例中的必选参数,示例中的可选参数如果您不需要设置,请将其删除,以免设置无效参数值与您的预期不符。
     */
    @Slf4j
    public class UploadVideoDemo {
    
        public static void main(String[] args) {
    
    //         五、查询视频列表
            GetVideoListResponse videoList = null;
            try {
                videoList = getVideoList(1000136018L, 0, 200);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            List<GetVideoListResponse.Video> videos = videoList.getVideoList();
            System.out.println("videos.size():" + videos.size());
    
            // 5.1视频信息
            List<GetVideoInfoResponse> getVideoInfoResponses = new ArrayList<>();
            List<GetPlayInfoResponse> getPlayInfoResponses = new ArrayList<>();
            for (GetVideoListResponse.Video video : videos) {
                try {
                    GetVideoInfoResponse videoInfo = OSSUploadVideoDemo.getVideoInfo(video.getVideoId());
                    GetPlayInfoResponse playInfo = OSSUploadVideoDemo.getPlayInfo(video.getVideoId());
                    getVideoInfoResponses.add(videoInfo);
                    getPlayInfoResponses.add(playInfo);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            System.out.println("getVideoInfoResponses.size():" + getVideoInfoResponses.size());
            // 5.2 视频流信息
            System.out.println("getPlayInfoResponses.size():" + getPlayInfoResponses.size());
    
    //         5.3 获取分类下所有视频列表
            List<GetVideoListResponse.Video> videoListAll = null;
            try {
                videoListAll = getVideoListAll(19L);
            } catch (Exception e) {
                e.printStackTrace();
            }
            if (JavaListUtils.isEmpty(videoListAll)) {
                return;
            }
            System.out.println("videoListAll.size():" + videoListAll.size());
    
            for (Suplier suplier : UploadVideoServiceImpl.suplierlist) {
                try {
                    OSSUploadVideoDemo.getPalyInfoToExcel(suplier);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        public final static Integer pageSizeFix = 100;
    
        /**
         * 获取全部视频列表
         *
         * @param catId 分类id
         * @return GetVideoListResponse 获取视频列表响应数据
         * @throws Exception
         */
        public static List<GetVideoListResponse.Video> getVideoListAll(Long catId) throws Exception {
    
            // 1 获取总数
            List<GetVideoListResponse.Video> videosOut = new ArrayList<>();
            GetVideoListResponse videoListFind = getVideoList(catId, 1, pageSizeFix);
            if (videoListFind == null) {
                System.out.println("获取的返回结果为空,catId:" + catId);
                return videosOut;
            }
            Integer total = videoListFind.getTotal();
            if (total == null || total <= 0) {
                System.out.println("获取的总数为空或者小于等于0,total:" + total);
                return videosOut;
            }
            Integer totalPage = total / pageSizeFix + 1;
            // 2 分页获取全部
            for (Integer i = 0; i < totalPage; i++) {
                GetVideoListResponse videoListIn = getVideoList(catId, i + 1, pageSizeFix);
                if (videoListIn != null && !JavaListUtils.isEmpty(videoListIn.getVideoList())) {
                    videosOut.addAll(videoListIn.getVideoList());
                }
            }
            System.out.println("获取的总数为,videosOut:" + videosOut.size());
            return videosOut;
        }
    
        /**
         * 获取分页视频列表   -最多200个
         *
         * @param catId    分类id
         * @param pageNo   页数   1开始
         * @param pageSize 每页数量 最大两百
         * @return GetVideoListResponse 获取视频列表响应数据
         * @throws Exception
         */
        public static GetVideoListResponse getVideoList(Long catId, Integer pageNo, Integer pageSize) throws Exception {
    
            DefaultAcsClient client = OSSUploadVideoDemo.initVodClient(OSSUploadVideoDemo.accessKeyId, OSSUploadVideoDemo.accessKeySecret);  // 发送请求客户端
    
            GetVideoListRequest request = new GetVideoListRequest();
            // 分别取一个月前、当前时间的UTC时间作为筛选视频列表的起止时间
            // 视频创建的起始时间,为UTC格式
            request.setCateId(catId);
            // 视频状态,默认获取所有状态的视频,多个用逗号分隔
            // request.setStatus("Uploading,Normal,Transcoding");
            request.setPageNo(pageNo);
            request.setPageSize(pageSize);
            return client.getAcsResponse(request);
        }
    
        /**
         * 本地文件上传接口
         *
         * @param accessKeyId
         * @param accessKeySecret
         * @param title
         * @param fileName
         * @param cateId          分类id
         */
        public static UploadVideoResponse testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName, Long cateId) {
            log.info("accessKeyId:{},accessKeySecret:{},title:{},fileName:{}", accessKeyId, accessKeySecret, title, fileName);
            UploadVideoResponse response = null;
            try {
                UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);
                /* 可指定分片上传时每个分片的大小,默认为2M字节 */
                request.setPartSize(2 * 1024 * 1024L);
                /* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/
                request.setTaskNum(1);
            /* 是否开启断点续传, 默认断点续传功能关闭。当网络不稳定或者程序崩溃时,再次发起相同上传请求,可以继续未完成的上传任务,适用于超时3000秒仍不能上传完成的大文件。
            注意: 断点续传开启后,会在上传过程中将上传位置写入本地磁盘文件,影响文件上传速度,请您根据实际情况选择是否开启*/
                //request.setEnableCheckpoint(false);
                /* OSS慢请求日志打印超时时间,是指每个分片上传时间超过该阈值时会打印debug日志,如果想屏蔽此日志,请调整该阈值。单位: 毫秒,默认为300000毫秒*/
                //request.setSlowRequestsThreshold(300000L);
                /* 可指定每个分片慢请求时打印日志的时间阈值,默认为300s*/
                //request.setSlowRequestsThreshold(300000L);
                /* 是否显示水印(可选),指定模板组ID时,根据模板组配置确定是否显示水印*/
                //request.setIsShowWaterMark(true);
                /* 设置上传完成后的回调URL(可选),建议您通过点播控制台配置事件通知,参见文档 https://help.aliyun.com/document_detail/55627.html */
                //request.setCallback("http://callback.sample.com");
                /* 自定义消息回调设置(可选),参数说明参考文档 https://help.aliyun.com/document_detail/86952.html#UserData */
                // request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}");
                /* 视频分类ID(可选) */
                request.setCateId(cateId);
                /* 视频标签,多个用逗号分隔(可选) */
                //request.setTags("标签1,标签2");
                /* 视频描述(可选) */
                //request.setDescription("视频描述");
                /* 封面图片(可选) */
                //request.setCoverURL("http://cover.sample.com/sample.jpg");
                /* 模板组ID(可选) */
                request.setTemplateGroupId("cfafe6e54e9a40"); 
                /* 工作流ID(可选) */
                //request.setWorkflowId("9577859b0177b");
                /* 存储区域(可选) */
                //request.setStorageLocation("in-201703232118266-5sejdln9o.oss-cn-shanghai.aliyuncs.com");
                /* 开启默认上传进度回调 */
                //request.setPrintProgress(false);
                /* 设置自定义上传进度回调 (必须继承 VoDProgressListener) */
                //request.setProgressListener(new PutObjectProgressListener());
                /* 设置您实现的生成STS信息的接口实现类*/
                // request.setVoDRefreshSTSTokenListener(new RefreshSTSTokenImpl());
                /* 设置应用ID*/
                //request.setAppId("app-1000000");
                /* 点播服务接入点 */
                request.setApiRegionId("cn-shanghai");  // 内网上传指定传输
    //            /* ECS部署区域*/
                request.setEcsRegionId("cn-shanghai");  // 内网上传指定传输
                UploadVideoImpl uploader = new UploadVideoImpl();
                response = uploader.uploadVideo(request);
                log.info("RequestId=" + response.getRequestId() + "\n");  //请求视频点播服务的请求ID
                if (response.isSuccess()) {
                    log.info("VideoId=" + response.getVideoId() + "\n");
                } else {
                    /* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */
                    log.info("VideoId=" + response.getVideoId() + "\n");
                    log.info("ErrorCode=" + response.getCode() + "\n");
                    log.info("ErrorMessage=" + response.getMessage() + "\n");
                }
                // 上线注释要去除掉
                File file = new File(fileName);
                file.delete();
            } catch (Exception e) {
                log.info("出错了msg6:{}", e.getMessage());
            }
            return response;
        }
    
    }
    

    一起学习,一起进步,有建议请提出。

    展开全文
  • 教室平台

    2016-07-07 10:28:22
    教室,桌面教室,多媒体教室,电子教室,数字化校园
  • 应用之教育简介

    2021-01-20 13:15:08
    构建教育是一个庞大的系统工程,由一个国家层面的公共教育云和成千上万的学校私有教育组成,而且私有教育建设要先行启动,教育管理部门制定标准,由各个学校自己主导建设。 公共教育应该由中央政府牵头完成...
  • 多媒体重定向

    千次阅读 2015-06-26 09:43:47
    桌面视频播放的一种方式,多媒体重定向。  远程桌面连接的多媒体重定向功能在客户端和主机端都支持时启用,其主要作用为在主机端播放的文件在客户端进行解码播放,而不是直接传送bitmap。其主要优势在于: ...
  • 云计算、公有、私有、混合 云计算(Cloud Computing)、公有(Public Cloud)、私有(Private Cloud)、混合(Hybr...
  • 快速了解阿里产品

    千次阅读 2019-04-21 16:46:12
    ECS ...替代传统以 Web Server 为中心的数据传输模式,将源站资源缓存到阿里全国各地的边缘服务器,供用户就近快速获取,提升用户体验,降低源站压力。 云盾 安骑士 监控 态势感知 ...
  • 阿里创立于2009年,是全球领先的云计算及人工智能科技公司,为200多个国家和地区的企业、开发者和政府机构提供服务。阿里致力于以在线公共服务的方式,提供安全、可靠的计算和数据处理能力,让计算和人工智能...
  • 等待配置完成就行 视频点播控制台里的资库里面的视频无法播放 最后发现了 视频点播控制台 里的资库里面的视频无法播放,原因是 因为配置的xxx.com域名没有配置证书,点播控制台是https的,chrome浏览器强制了...
  • 阿里、百度、腾讯哪家好?

    千次阅读 2019-05-12 13:40:57
    服务器的业务承载能力,可扩展性和安全稳定性都对未来业务扩大带来不可估量的影响,客流的增大,数据计算量的起伏都是选择服务器及其功能的重要参考标准,阿里、百度、腾讯这三大服务商,自然各有各的优势...
  • ​由于需要帮公司客户(开发Web业务系统)选购腾讯并做相关报价方案,所以业余时间写了这份文档来帮助客户如何选择腾讯相关服务器配置—腾讯服务器购买指南 国内的服务器上知名的就那么几家,腾讯是排名...
  • 本系列会介绍OpenStack 企业私有的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合(Hybrid cloud)支持 主流硬件支持、快速交付 和 SLA 保证 大...
  •  “11月2日晚间,阿里巴巴集团公布2017财年第二季度(2016年7月1日至2016年9月30日)业绩,云计算业务保持强劲活力,付费用户数量增长至65.1万,推动阿里营收达到历史新高14.93亿元,同比增长130%,连续第六个...
  • -阿里-百科:阿里

    千次阅读 2019-04-04 16:22:00
    ylbtech--阿里-百科:阿里 阿里,阿里巴巴集团旗下云计算品牌,全球卓越的云计算技术和服务提供商。创立于2009年,在杭州、北京、硅谷等地设有研发中心和运营机构。 阿里创立于2009年,是全球领先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,576
精华内容 10,630
关键字:

云自媒