• [技术干货] 【历史上的今天】4 月 23 日:YouTube 上传第一个视频;网易云音乐正式上线;数字音频播放器的发明者出生【转载】
    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。今天是 2022 年 4 月 23 日,世界读书日。在 1564 年的这一天,全世界最卓越的文学家之一莎士比亚出生;1616 年的这一天,莎士比亚与西班牙最伟大的作家塞万提斯辞世。还有其他一些伟大作家的生卒日也在这一天,如诺贝尔文学奖得主拉克斯内斯、俄国作家纳博科夫。1995 年,联合国教科文组织规定 4 月 23 日为世界图书与版权日,简称“世界读书日”。回顾计算机历史上的 4 月 23 日,这一天又发生过哪些关键事件呢?1956 年 4 月 23 日:数字音频播放器的发明者 Kane Kramer 出生凯恩·克雷默(Kane Kramer)出生于 1956 年 4 月 23 日,他是英国的一位发明家。在 1979 年,也就是他 23 岁的时候,他发明了一种名为 IXI 的音乐播放器;这枚播放器只有信用卡大小,其上方有一个长方形的屏幕,下方有四个方向的按钮,音乐则储存在一个可更换的芯片之中。不仅如此,克雷默在当时就提出了用电话线传播音乐的想法。他为这个发明注册了全球专利,但是在 1988 年,因为没有足够的钱给专利延期,专利进入了公有领域。在 2007 年,Burst.com 声称苹果公司的 iPod 侵犯了自己的专利权,苹果请克雷默到美国说明他的发明早于 Burst.com 的专利。之后两家公司达成了和解。不过,作为 iPod 的概念的发明人,克莱默并没有从中获得许多经济利益。他自称买不起 iPod,而苹果公司送给他的 iPod 也被他用坏了。如今,克雷默仍在便携式数据处理和存储系统等技术领域工作,他是英国发明家协会主席和英国发明展和世界发明奖的组织者,业余时间他会拍拍电影、组织音乐会,陶冶情操。2005 年 4 月 23 日:YouTube 上传第一个视频YouTube 成立于 2005 年 2 月,由三名前 PayPal 雇员:查得·贺利、陈士骏、贾德·卡林姆创办;同年 4 月 23 日,YouTube 第一部上传视频,标题为“我在动物园”。在为 PayPal 工作前,查德于宾州印第安那大学学习设计,陈士骏则共同在伊利诺伊大学厄巴纳-尚佩恩分校学习计算机科学。YouTube 创办的原意是为了方便朋友之间分享录视频段,后来逐渐成为网友的回忆存储库和作品发布场所。就像许多以新技术创业的公司,YouTube 开始时亦是靠天使投资者注资创立,办公室也只是在一间简陋的车库内。2006 年 11 月,Google 公司以 16.5 亿美元收购 YouTube,并把其当作一间子公司来经营。Google 最初对于如何透过 YouTube 盈利,一直保持着谨慎的态度。收购后的 YouTube 依然风靡全球网络用户。花旗银行分析师认为,以 2012 年计算,Google 从 YouTube 获得 24 亿美元的收入。无 Google 账号的用户仍可以观看 YouTube 中的视频,但无法上传视频及留言。注册用户可以无限量上传视频。如今,YouTube 已经成为影音网站的翘楚,不单在娱乐音乐市场上吸引观众,又成功把庞大流量转变为社区平台,并激发网上创作产业,例如每年 YouTube 名人的演出 YouTube FanFest 等收看人数与收入都相当惊人,同时企业则申请官方账号用作广告与在线传媒、NGO 的推广公关等等,成为又一段硅谷文化新创成功的经营典范,当然也是因为硬件支持,才能承受庞大的信息量而发展起来,还有恰好的创业时机换来的知名度与其爆红效应。尽管有大量用户支持,但同类型网站激烈竞争下内容更变得重要,因此,近几年 YouTube 的眼光开始投向网络知名制作者;YouTube 对这些拥有百万订阅的人十分器重,会给予他们奖杯反馈与官方聚会活动邀请、以及更高的薪资分红等等(这类职业化的视频创作者被称为 YouTuber)。追求高点击率,已经成为世界上许多人获取财富的方式之一。2013 年 4 月 23 日:网易云音乐正式上线网易云音乐(NetEase Cloud Music)是中国网易公司自 2013 年 4 月 23 日基于网易云服务推出的一个音乐平台,除了提供主要的音乐播放、下载与查找服务外,还提供音乐社交功能,如歌曲评论、声学指纹(听歌识曲)、根据历史播放记录的歌单推荐、地理位置识别等。网易云音乐以其个性化推荐(包括每日推荐、私人FM、心动模式)为卖点,一经推出便在当年的应用市场走红。网易云音乐现支持 iOS、Android、Windows、 Linux 在内的多个操作系统。截至 2017 年 11 月,网易云音乐用户数量超过 4 亿,用户创建歌单达 4 亿个,用户评论数达 4 亿个。由于许多唱片公司(如 King Records)要求向用户收取数字专辑的费用,网易云音乐上越来越多的音乐开始转变为付费收听和下载的模式,无损格式的音乐则全部收费,还有一部分音乐由于网易暂未获取授权而不能播放;在 2018 年 3 月移动端的 5.0.0 更新后,网易云重构了移动端的用户界面,将原本不太引人注意的视频模块放置到了首页。这意味着网易开始重视云音乐的短视频功能。原文链接:https://blog.csdn.net/Byeweiyang/article/details/124361554
  • [技术干货] 【2022年第一期 CANN训练营进阶班应用课】附加题——媒体数据处理+模型推理
    首先来看下要求简单来说,就是利用所学,完成YOLOv3完整的推理过程!下面来逐步操作吧。1. 完成模型转换注意,模型转换要涉及处理模型输入数据的大小和格式,这一点要明确。这里先参照开发手册上提供的模型和配套教程走一遍,验证下流程。先建一个文件夹用来保存整个过程的文件mkdir yolov3_detection # 接下来建立model文件夹,保存模型 mkdir model # 接下来,下载模型和配置文件 wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/yolov3.caffemodel wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/yolov3.prototxt wget https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/Yolov3/aipp_nv12.cfg运行截图:接下来,参照指导,进行模型转换:# 注意,这里使用的是官方给的命令,会导致转换的模型后缀为.om.om,不建议使用 atc --model=yolov3.prototxt --weight=yolov3.caffemodel --framework=0 --output=yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg # 建议使用本命令,这样转换得到的模型是.om后缀 atc --model=yolov3.prototxt --weight=yolov3.caffemodel --framework=0 --output=yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32 --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg注意,参照教程这里的--output是以.om结尾,但是发现这会导致生成的模型是 yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om.om,即是以.om.om结尾,有点奇怪,不过不影响运行,毕竟只是个名字,但是这会影响到后续的执行,因为教程后续用的是yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om而我们实际生成的是yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om.om这在系统看来完全是两个不同的模型,因此,要注意统一名称,只要保持先后一致即可,这里我选择的是直接用实际生成的.om.om模型吧!再次需要注意的是这里仅仅是对样例说明,如果将模型用于推理,则一定要用.om模型,如果再用.om.om模型就会报错(当然,也可能是权限不够,因为我们运行时,使用的是HwHiAiUser用户),因此,从规范和长远角度来说,应该用.om模型,我这里的选择用.om.om模型是不明智的,有些糟糕,建议大家直接用上方转换模型的第二条命令,直接得到.om模型,推荐!推荐!推荐!这个模型转换过程资源消耗较大,需要稍等一下,运行成功截图:接下来,使用使用msame工具推理,先来准备一下,这里官方提供了较为详细的教程,跟着做就行了:git clone https://gitee.com/ascend/tools.git export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/acllib/lib64/stub cd $HOME/tools/msame/ chmod +x build.sh ./build.sh g++ $HOME/tools/msame/out cd out # 注意,这里的--model和--output路径根据实际模型存放路径和你想输出的路径填写 ./msame --model /home/HwHiAiUser/yolov3_detection/model/yolov3_framework_caffe_aipp_1_batch_1_input_int8_output_FP32.om.om --output /home/HwHiAiUser/yolov3_detection/model/msame_infer --outfmt TXT --loop 100 程序运行成功的部分截图:可以到我们指定的输出路径下看到生成的结果文件至此的整个过程按照开发文档中提供的教程操作即可,还是比较简单的。2. 结合所学,完成模型推理这里参考了官仓的样例,基于上述得到的模型进行推理,完整代码会提交在作业帖中,并附有README,分为模型准备和转换、编译和运行三部分,正常运行推理后可得到结果
  • [技术干货] 【历史上的今天】4 月 21 日:微处理器先驱诞生;Winamp 发布;COPPA 正式生效【转载】
    透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。今天是 2022 年 4 月 21 日,在 2006 年的今天,数码资讯网站 IT168 CEO 确认公司已经收购技术社区 ITPUB。宋刚则表示,收购 ITPUB 将有助于 IT168 更好地覆盖企业高端用户。因为 IT168 开始关注高端人群和企业用户,ITPUB 上汇聚了许多企业优秀的技术人才,他们是企业采购的决定者。回顾互联网历史上的 4 月 21 日,这一天还发生过哪些关键事件呢?1950 年 4 月 21 日:微处理器先驱 Wayne Pickette 出生微处理器是二十世纪最伟大的技术进步之一,而众所周知,世界上第一个微处理器 Intel 4004 是由 Faggin、Hoff、Mazor 和 Shima 四位设计者和发明者共同完成的;但是关于微处理器的设想,可能还要更早。英特尔曾经雇佣了一名叫做韦恩·皮克特(Wayne Pickette)的非裔员工,韦恩对 4004 开发的贡献在很大程度上没有得到他的前雇主英特尔的认可。韦恩·皮克特(Wayne Pickette)出生于 1950 年 4 月 21 日,他于 1968 年创建了将计算机放在芯片上的设计,随后他致力于开发第一台微型计算机,是世界上最早使用交换机作为服务器骨干网的工作人员之一。韦恩是一位自学成才的电子工程师,他学生时代的兴趣便是设计一个计算机化的视频系统,用于在电视上共享图书馆资料。1967 年,17 岁的他购买了一台 PDP-8/S 计算机,以便为他的项目进行计算。当时,刚看完科幻作品《我,机器人》的韦恩·皮克特便在设想怎么将所有逻辑功能都放置在单个微芯片上。1968 年 2 月,韦恩向仙童半导体公司展示了他的设计,但该公司以“疯狂”为由拒绝了他的想法。1968 年夏天,失意的韦恩开始在 IBM 工作,即为 IBM 的温彻斯特项目进行逻辑设计;在这个项目中,当今个人计算机中常见的硬盘驱动器得以创建。1970 年春天,韦恩跳槽至英特尔,并提出了自己对计算机的想法架构和小型化的概念,这一次,韦恩再次获得了失败,。回顾 Intel 4004 开发的故事便能知道,这段时期的英特尔正在集中精力开发存储芯片而非逻辑芯片,1969 年 6 月,Busicom 公司的岛正利(Masatoshi Shima)和其他人员一起访问英特尔,探讨了定制芯片组问题,韦恩也在项目组内。但是,英特尔应用部门的负责人特德·霍夫(Ted Hoff)当时很担心英特尔很难生产满足 Busicom 公司的要求,于是到了 1970 年年初,该项目在英特尔内部逐渐停顿。1970 年夏末,韦恩从工程师费德里科·法金(Frederico Faggin)那里了解到 Intel 4001 到 Intel 4004 芯片的情况,此时 Busicom 濒临破产,英特尔管理层放弃了这款产品,而法金一入职便接手了该项目。特德·霍夫邀请韦恩和法金去他家吃饭,三人聊了微处理器的事;霍夫甚至给了韦恩一本名为《未来的冲击》(Future Shock)的书,书中描述了社会对变化的抗拒。随后,当项目组不得不投票“关于是否在 1971 年拉斯维加斯秋季联合计算机会议上推出 4004”时,年仅 21 岁的韦恩急于求成、年少轻狂,成为了唯一一个赞成提前展示 Intel 4004 的人。但在 1970 年年底,4004 芯片正式完成,此时韦恩早已退出了项目组。1971 年 3 月,Busicom 公司终于获得了一套完整的 4000 系列芯片组。在 Intel 4004 之前,唯一放置在集成电路上的是逻辑功能。韦恩是第一个想把算术元件、指令逻辑、时序逻辑和寄存器逻辑,把所有这些不同的 IC 都放在一个芯片上的人。1971 年 11 月,英特尔开始宣传 4004,广告语为:“宣告集成电子设备新时代。”1997 年 4 月 21 日:Winamp 发布Winamp 是一个由 Nullsoft 公司开发的 Windows 与 Android 下的媒体播放器软件,曾被美国在线(AOL)收购,现为 Radionomy 旗下产品之一。Winamp 支持多种媒体格式,支持皮肤更换,支持通过各种插件扩展,同时也具有最基本的播放列表和媒体库功能。Winamp 以其声音效果、播放列表和媒体库功能而出名。随着 MP3 的共享,其知名度迅速增长。Winamp 的作者是 Justin Frankel、Dmitry Boldyrev 和 Shiva Ayyadurai。播放器包含免费版和共享版等版本。1998 年 2 月,Winamp 程序被重写为“通用音频播放器”(General purpose audio player),并采取插件支持构造,评论反馈良好。此后经过快速和多元化的开发,当年 11 月已经开发出 66 个插件,Winamp SDK 甚至能方便开发人员开发出七种不同类型的插件。美国在线于 2013 年 11 月 20 日宣布将于当年 12 月 20 日起关闭 Winamp 的网站,并不再维护和提供下载服务;2014 年 1 月 14 日,Radionomy 自 AOL 手中收购 Winamp 与网站 SHOUTcast,至今仍在运营和更新。2000 年 4 月 21 日:COPPA(儿童在线隐私保护法)生效儿童在线隐私保护法(Children’s Online Privacy Protection Act,简称 COPPA)首次出版于 1998 年 10 月 21 日,主要针对在线收集 13 岁以下儿童个人信息的行为。它详细介绍了网站运营商必须包括的隐私政策,何时以及如何获得父母或监护人同意,以及应尽的责任,运营商必须保护儿童的隐私和安全,包括限制向 13 岁以下的儿童销售。COPPA 于 2000 年 4 月 21 日正式生效。未成年人是特殊群体,在信息化的时代,应当受到特殊保护。未成年人信息数据随意发布、收集和使用的现象能引发许多的思考;尽管 13 岁以下的儿童可以在父母允许的情况下合法地提供个人信息,但许多网站——尤其是社交媒体网站,以及其他收集大部分个人信息的网站——由于成本和所涉及的工作,通常无法贯彻对于未成年人的保护。我国对于未成年人的限制是 18 岁而不是 13 岁,但相对应地也少了许多有力限制,比如当前美国、欧盟和英国都规定了儿童个人信息的收集和使用应当经过其监护人的同意。你对于未成年人的网络隐私有什么看法?你觉得应该做出哪些措施呢?欢迎参与本期评论区,分享你的真知灼见。原文链接:https://blog.csdn.net/Byeweiyang/article/details/124316533
  • [技术干货] live555搭建流媒体服务器+MindxSDK
    三、使用live555搭建 rtsp server(1)安装live555wget http://www.live555.com/liveMedia/public/live555-latest.tar.gztar xzf live555-latest.tar.gzcd live编译:1、修改vim config.linux-64bitMakefile.tail文件中的-m64为-mabi=lp64(因为-m64是x86的编译选项,鲲鹏上要使用-mabi=lp64替换。)2、./genMakefiles linux-64bit #注意后面这个参数是根据当前文件夹下config.<后缀>获取得到的3、make结束编译。视频文件获取:http://www.live555.com/liveMedia/public/(3)验证rtsp server是否正常下面上传test.264文件到 live555MediaServer 同级目录启动rtsp servercd mediaServer./live555MediaServer使用rtsp协议访问的地址 rtsp://你的ip/文件名 例:rtsp://127.0.0.1/video.264.然后请准备一个流媒体播放器,我下载的是vlc播放器输入测试地址后点击播放,播放的时候能看到视频,说明rtsp server功能正常。测试代码:1、下载附件代码,进入代码修改run.sh中的MX_SDK_HOME根据自己实际安装的路径2、修改pipeline/Sample.pipeline中的rtspUrl地址为拉流服务器所在的地址。3、修改run.sh权限chmod +x run.sh4、执行run.sh./run.sh5、目录下会生成out.h2646、生成的out.h264视频使用VLC播放器能正常播放和能正常识别目标框。
  • [问题求助] 【Atlas 200 DK产品】【配置】将媒体应用程序编译依赖的相关文件从板端环境中拷贝到开发环境时报错
    【功能模块】【操作步骤&问题现象】1、通过USB与pc链接scp -r HwHiAiUser@192.168.1.2:/usr/lib64/libmedia_mini.so ${INSTALL_DIR}/driver2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [热门活动] cann训练营课程打卡
    1、进阶班-媒体数据处理精讲与实战课-本课程是否适合您?2、进阶班-媒体数据处理精讲与实战课-课程目标3、应用开发课-遇到问题如何求助4、进阶班-媒体数据处理精讲与实战课-AI应用体验5、进阶班-媒体数据处理精讲与实战课-媒体数据处理是什么6、进阶班-媒体数据处理精讲与实战课-媒体数据处理用在什么场景7、进阶班-媒体数据处理精讲与实战课-媒体数据处理在接口调用流程中的位置8、JPEG图片解码——ACL数据预处理9、抠图缩放——ACL数据预处理10、视频码流编码视频课程同上gitee代码仓学习如下
  • [技术干货] 【2022年第一期 CANN训练营】打卡集合——进阶班应用开发课 CANN训练营-走进媒体数据处理(下)
    华为云账号:Tianyi_Li班级:进阶班应用开发课CANN训练营-走进媒体数据处理(下)
  • [技术干货] 【2022年第一期 CANN训练营】打卡集合——进阶班应用开发课 CANN训练营-走进媒体数据处理(上)
    华为云账号:Tianyi_Li班级:进阶班应用开发课CANN训练营-走进媒体数据处理(上)
  • [技术干货] 进阶班应用开发课-大作业1
    班级:进阶班应用开发课大作业1作业要求PEG 图片解码+图片缩放 +JPEG 图片编码  我们的目标: 基于第一课所讲解的内容以及参考源码,通过实战巩固所学的知识点。  实战场景:开发媒体数据处理的应用,应用的输入、输出均为 JPEG 图片,输入和 输出的 JPEG 图片分辨率不同。  提示点: 1. 媒体数据处理各功能串联时,可实现内存复用: − JPEG 图片的输出可以作为图片缩放的输入; − 图片缩放的输出可以作为 JPEG 图片编码的输入。2. JPEG 图片解码、图片缩放等处理后的输出图片,由于图片宽、高的对齐约束,可 能存在绿边,该实战中学员可以不关注绿边。 在模型推理场景下,为了保证精度,CANN 提供了 AIPP(Artificial Intelligence Pre-Processing)功能消除绿边,您可在昇腾社区文档中心,选择“开发者文档 (社区版)”中的“5.0.5.alpha001”版本,在“应用开发”区域单击“将已有模型通 过 ATC 工具转换 (命令行)”,查阅 AIPP 的相关介绍。3.  评分规则:%2. 图片解码完成且正确,上传运行成功结果截图、处理前和处理后的图片、以及源码 至作业提交专用帖。 5 分%2. 解码后的图片数据被正确缩放,上传运行成功结果截图、处理前和处理后的图片、 以及源码至作业提交专用帖。 5 分%2. 图片解码+图片缩放+图片编码串起来实现了完整的功能,上传运行成功结果截图、 处理前和处理后的图片、以及源码至作业提交专用帖。 5 分阅读解码的sh文件可知,该样例图片是一只小狗狗,我们会先将这张小狗狗图片下载到服务器上。jpegd样例su HwHiAiUser cd ~ cd ${HOME}/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/scripts bash sample_build.sh bash sample_run.sh中途需要输入x86,执行完sample_build.sh后,我们已经下载了小狗狗图片了。打开sample_run.sh阅读一下有关代码这段代码会执行我们刚刚编译生成的可执行文件main,执行sample_run.sh后,图片已经解码这里就是我们生成的yuv文件。我们把处理前后的图片都下载到本地。resize样例功能:调用dvpp的resize接口,实现图像缩放功能。样例输入:原始YUV图片。样例输出:缩放后的YUV图片。cd ${HOME}/samples/cplusplus/level2_simple_inference/0_data_process/resize/scripts bash sample_build.sh同样的,我们可以看看sample_build.sh里面的内容它会先下载一直兔子图片到我们的服务器本地。然而这次我们还是想处理那只小狗狗的图片,于是我们将刚刚生成的.yuv文件cp过来。cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpegd/out/output cp *.yuv /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/data/修改一下sample_run.sh#修改sample_run.sh文件,将resize的yuv文件名和resize前后的大小改一下: cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/resize/scripts vi sample_run.sh把running这一行修改为running_command="./main ../data/dvpp_output.yuv 1024 688 ./output/output_dog.yuv 640 480 "bash sample_run.sh cd ../out/output ls # 可以看见输出的yuv文件,右键download下载到本地。jpege样例功能:调用dvpp的jpege接口,实现图片编码的功能。样例输入:待编码的YUV图片。样例输出:编码后的jpeg图片。cd /home/HwHiAiUser/samples/cplusplus/level2_simple_inference/0_data_process/jpege/scripts bash sample_build.shcp ../../resize/out/output/output_dog.yuv ../data/ vi sample_run.sh将./main 后面加上执行文件的地址bash sample_run.sh我们在output文件夹下就可以看到输出的文件,是一条狗图,下面还有绿边。
  • [技术干货] 【CANN训练营进阶班应用课笔记】
    # 直播截图 (入营时间较晚,第一次直播没来得及看) 第二次直播 ![第二次直播](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/2/1648898292895985967.png) # 视频课程打卡 预习课程1 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/8/1649410167021989923.png) 预习课程2 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/8/1649410232320167459.png) 预习课程3 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/8/1649416111672596698.png) 预习课程4 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649820614678776695.png) 预习课程5 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649820659652687720.png) 预习课程6 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/13/1649820690654954999.png)开营 ![开营](https:/bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/30/1648623897945608588.jpg)第一次直播 ![第一次直播](https:/bbs-img.huaweicloud.com/data/forums/attachment/forum/20223/27/1648378012869210815.png)
  • [其他] 媒体:中国正在人工智能技术发展领域超越美国
    土耳其《每日晨报》撰文指出,中国正在在人工智能技术发展领域超越美国,并很快将全球领先。文章称:“技术进步让中国赢了与美国抢先发展人工智能之战,很快就将全球领先。根据西方情报部门的评估,中国这个已成为世界第二大经济体的国家,10到20年后将在人工智能、合成生物学和基因学等主要新技术领域取得主导地位。”文章指出,全球超级计算机500强榜单中,中国的超级计算机数量是美国的两倍。此外,中国也在数据生成领域领先。文章称:“能在人工智能研究和应用领域取得主导地位的国家将决定这项技术的未来,并获得显著的经济竞争优势,其他国家则面临在关键行业失去优势的风险。”转载自 智能网
  • [行业资讯] 如何使用视频媒体网关IP Stream功能将多个流合成一路多画面输出?
    随着音视频IP化技术的快速发展,网络直播视频传输领域在各行各业已应用广泛,对于大型节目制作及活动每个现场都会有多个机位,那么如何把多机位的摄像机视频画面合成一路画面推流直播呢?目前IP Stream功能就可以很好的解决这个问题,IP Stream是可以让您的网络摄像头像 IP 摄像头一样工作。目前MG300视频网关IP Stream功能可以将多个视频流合成一路多画面输出到平台。MG300视频网关不仅仅一款简单的协议转换网关设备,它更像是一款无所不能的流媒体服务器,高性能、低成本的解决方案。视频网关多画面合成的原理是:通过把不同协议的视频流解码后,合成一路视频流,再重新编码推流。今天我们以哔哩哔哩举例,为大家详细讲解操作步骤。具体操作分为四步:第一步:建立布局第二步:添加视频源第三步:将多个流合成一个多画面第四步:将合成画面输出显示第一步:建立布局首先,我们登录到MG300管理界面后台,点击output窗口的添加布局,然后自定义一个布局;最多9分屏,我们现在演示新增一个4分屏。第二步:添加视频源在视频源处,添加需要使用的视频源。第三步:将多个画面合成一个画面将需要合成的画面,添加到output窗口的布局上,并整理好布局页面。选择ip stream  编码的配置。第四步:将合成画面输出到直播平台首先点击流服务,选择添加一个发布点,视频选择Output,然后新建一个流服务,我们现在以推流到B站平台为例,演示如何推流。我们新建一个RTMP流,填写B站平台的推流地址,然后点击完成。完成设置后,我们就可以在B站看到我们推送的直播视频。MG300视频网关是一款流媒体协议转换、流媒体分发服务、多路视频解码、视频多画面分割等核心功能于一体的设备。可应用于将不同系统、不同类型、不同编码的视频协议相互转换,如(监控转直播、局域网转互联网直播、主流协议转NDI|HX/SRT)。同时还具备解码输出(9路流同时解码)、分割显示,还可实现50路并发能力的流媒体服务器功能。可广泛应用于监控转直播、NDI协议转换、单节目多平台直播、SRT多点传输、多画面合屏直播、4K视频解码上墙等各类视频工程项目。
  • [技术干货] 2022CANN训练营进阶应用开发课学习随记
    2022年CANN训练营第一期终于喜迎开营仪式,又见熟悉的老谭今年的CANN训练营玩法还去年大差不差,还是那些花头,在我看来就是不断的实践中学习新知识。不过进阶应用开发涉及到C++,不是强项,目标能顺利水到结业就好,拿奖那都是大佬们的事情。CANN进阶应用开发第一课终于开始了,这一期还是大毛老师来讲,那应该可以有不少的收获了,需要认真听讲。CANN第一次课程主要的笔记:视频或图像的解码、缩放等媒体数据处理操作广泛应用于安防、计算机视觉等领域,为人工智能赋能各行各业舔砖加瓦。昇腾CANN 提供了如下媒体数据处理的功能媒体数据处理应用场景媒体数据处理(视频解码、缩放)使用Yolov3 模型实现目标检测的场景下,用户提供的输入视频为H264/H265 编码格式、分辨率为1920*1080,但Yolov3 模型要求的输入图片格式为RGB/YUV、分辨率为416*416,两者不一致,此时可以使用媒体数据处理接口执行以下一系列处理。媒体数据处理(图片解码、缩放)媒体数据处理(抠图、缩放、格式转换)图片解码基本原理:调用acldvppCreateChannel接口创建图片数据处理的通道、调用acldvppDestroyChannel接口销毁图片数据处理的通道。调用acldvppJpegDecodeAsync异步接口,解码.jpg、.jpeg、.JPG、.JPEG图片。对于异步接口,还需调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成。根据存放JPEG图片数据的内存,调用acldvppJpegPredictDecSize接口预估出JPEG图片解码后所需的输出内存的大小。实际输出内存大小可能与调用acldvppJpegPredictDecSize接口预估的内存大小存在差异,如果用户需要获取解码后的实际输出内存大小,需调用acldvppPicDesc类型下的acldvppGetPicDescSize接口获取。图片编码基本原理:调用acldvppCreateChannel接口创建图片数据处理的通道、调用acldvppDestroyChannel接口销毁图片数据处理的通道。调用acldvppJpegEncodeAsync异步接口,将YUV格式图片编码成.jpg图片。对于异步接口,还需调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成。根据输入图片描述信息、图片编码配置数据,调用acldvppJpegPredictEncSize接口预估图片编码后所需的输出内存的大小。实际输出内存大小可能与调用acldvppJpegPredictEncSize接口预估的内存大小存在差异,如果用户需要获取编码后的实际输出内存大小,可通过acldvppJpegEncodeAsync接口的出参size获取。功能约束:JPEGE(JPEG Encoder)将YUV格式图片编码成JPEG压缩格式的图片文件,例如*.jpg。JPEGE输入的约束:输入图片分辨率:最大分辨率:8192*8192,最小分辨率:32*32。输入图片格式:支持acldvppPixelFormat枚举值中的如下枚举项:PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, // YUV420SP NV12 8bit PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2, // YUV420SP NV21 8bit PIXEL_FORMAT_YUYV_PACKED_422 = 7, // YUV422Packed YUYV 8bit PIXEL_FORMAT_UYVY_PACKED_422 = 8, // YUV422Packed UYVY 8bit PIXEL_FORMAT_YVYU_PACKED_422 = 9, // YUV422Packed YVYU 8bit PIXEL_FORMAT_VYUY_PACKED_422 = 10, // YUV422Packed VYUY 8bit输入图片的widthStride、heightStride:输入图片的widthStride(即对齐后的宽度),对齐到16,兼容对齐到16的倍数如128。对于YUV422packed数据,widthStride应该为输入图片宽度的两倍对齐到16。输入图片的heightStride,取值:配置为与输入图片的高度相同的数值;或配置为输入图片的高度向上对齐到16的数值(最小为32)。其中后一种取值的使用场景举例:JPEGD的输出图片直接作为JPEGE的输入(JPEGD输出图片高度是向上对齐到16的)。 输入内存:输入内存首地址要求128对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。输入内存大小(单位Byte)与图片数据的格式相关,计算公式如下:YUV422packed:widthStride*heightStrideYUV420SP:widthStride*heightStride*3/2JPEGE输出的约束:输出图片格式:JPEG压缩格式的图片文件,例如*.jpg。只支持huffman编码,不支持算术编码,不支持渐进编码。输出内存:输出内存的大小就是指实际的编码后图片所占用的大小。可调用acldvppJpegPredictEncSize接口预估输出内存大小。输出内存首地址要求128对齐。调用acldvppMalloc接口/acldvppFree接口申请或释放内存,这部分内存的生命周期由用户自行管理。主要代码参考JPEGE图片编码主要代码:// 1.AscendCL初始化 // 2.运行管理资源申请,包括Device、Context、Stream // 3.创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型 dvppChannelDesc_ = acldvppCreateChannelDesc(); // 4.创建图片数据处理的通道 aclRet = acldvppCreateChannel(dvppChannelDesc_); // 5.申请输入内存(区分运行状态) // 调用aclrtGetRunMode接口获取软件栈的运行模式,如果调用aclrtGetRunMode接口获取软件栈的运行模式为ACL_HOST,则需要通过aclrtMemcpy接口将输入图片数据传输到Device,数据传输完成后,需及时释放内存;否则直接申请并使用Device的内存 aclrtRunMode runMode; ret = aclrtGetRunMode(&runMode); // inputPicWidth、inputPicHeight分别表示图片的对齐后宽、对齐后高,此处以YUV420SP格式的图片为例 uint32_t PicBufferSize = inputPicWidth * inputPicHeight * 3 / 2; if(runMode == ACL_HOST){ // 申请Host内存vpcInHostBuffer void* vpcInHostBuffer = nullptr; vpcInHostBuffer = malloc(PicBufferSize); // 将输入图片读入内存中,该自定义函数ReadPicFile由用户实现 ReadPicFile(picName, vpcInHostBuffer, PicBufferSize); // 申请Device内存inDevBuffer_ aclRet = acldvppMalloc(&inDevBuffer_, PicBufferSize); // 通过aclrtMemcpy接口将输入图片数据传输到Device aclRet = aclrtMemcpy(inDevBuffer_, PicBufferSize, vpcInHostBuffer, PicBufferSize, ACL_MEMCPY_HOST_TO_DEVICE); // 数据传输完成后,及时释放内存 free(vpcInHostBuffer); } else { // 申请Device输入内存inDevBuffer_ ret = acldvppMalloc(&inDevBuffer_, PicBufferSize); // 将输入图片读入内存中,该自定义函数ReadPicFile由用户实现 ReadPicFile(picName, inDevBuffer_, PicBufferSize); } // 6. 创建编码输入图片的描述信息,并设置各属性值 // encodeInputDesc_是acldvppPicDesc类型 encodeInputDesc_ = acldvppCreatePicDesc(); acldvppSetPicDescData(encodeInputDesc_, reinterpret_cast<void *>(inDevBuffer_)); acldvppSetPicDescFormat(encodeInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(encodeInputDesc_, inputWidth_); acldvppSetPicDescHeight(encodeInputDesc_, inputHeight_); acldvppSetPicDescWidthStride(encodeInputDesc_, encodeInWidthStride); acldvppSetPicDescHeightStride(encodeInputDesc_, encodeInHeightStride); acldvppSetPicDescSize(encodeInputDesc_, inDevBufferSizeE_); // 7. 创建图片编码配置数据,设置编码质量 // 编码质量范围[0, 100],其中level 0编码质量与level 100差不多,而在[1, 100]内数值越小输出图片质量越差。 jpegeConfig_ = acldvppCreateJpegeConfig(); acldvppSetJpegeConfigLevel(jpegeConfig_, 100); // 8. 申请输出内存,申请Device内存encodeOutBufferDev_,存放编码后的输出数据 uint32_t outBufferSize= 0; ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize); ret = acldvppMalloc(&outBufferDev_, outBufferSize) // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_); aclRet = aclrtSynchronizeStream(stream_); // 10. 编码结束后,释放资源,包括编码输入/输出图片的描述信息、编码输入/输出内存、通道描述信息、通道等 acldvppDestroyPicDesc(encodeInputDesc_); if(runMode == ACL_HOST) { // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存 // 申请Host内存outputHostBuffer void* outputHostBuffer = nullptr; outputHostBuffer = malloc(outBufferSize_); // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize_, encodeOutBufferDev_, outBufferSize_, ACL_MEMCPY_DEVICE_TO_HOST); // 释放掉输入输出的device内存 (void)acldvppFree(inputDevBuff); (void)acldvppFree(encodeOutBufferDev_); // 数据使用完成后,释放内存 free(outputHostBuffer); } else { // 此时运行在device侧,处理结果也在Device侧,可以根据需要操作处理结果后,释放Device侧内存 (void)acldvppFree(inputDevBuff); (void)acldvppFree(encodeOutBufferDev_); } acldvppDestroyChannel(dvppChannelDesc_); (void)acldvppDestroyChannelDesc(dvppChannelDesc_); dvppChannelDesc_ = nullptr; // 11. 释放运行管理资源 // 12. AscendCL去初始化 // ....JPEGD图片解码主要代码:// 1.AscendCL初始化 // 2.运行管理资源申请,包括Device、Context、Stream // 3.创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型 dvppChannelDesc_ = acldvppCreateChannelDesc(); // 4.创建图片数据处理的通道。 aclError ret = acldvppCreateChannel(dvppChannelDesc_); // 5. 申请输入内存(区分运行状态) // 调用aclrtGetRunMode接口获取软件栈的运行模式,如果调用aclrtGetRunMode接口获取软件栈的运行模式为ACL_HOST,则需要通过aclrtMemcpy接口将输入图片数据传输到Device,数据传输完成后,需及时释放内存;否则直接申请并使用Device的内存 aclrtRunMode runMode; ret = aclrtGetRunMode(&runMode); if(runMode == ACL_HOST){ // 申请Host内存inputHostBuff,并将输入图片读入该地址,inDevBufferSize为读入图片大小 void* inputHostBuff = nullptr; inputHostBuff = malloc(inDevBufferSize); // 将输入图片读入内存中,该自定义函数ReadPicFile由用户实现 ReadPicFile(picName, inputHostBuff, inDevBufferSize); // 申请Device内存inDevBuffer_ aclRet = acldvppMalloc(&inDevBuffer_, inDevBufferSize); // 通过aclrtMemcpy接口将输入图片数据传输到Device aclRet = aclrtMemcpy(inDevBuffer_, inDevBufferSize, inputHostBuff, inDevBufferSize, ACL_MEMCPY_HOST_TO_DEVICE); } else { // 申请Device输入内存inDevBuffer_ ret = acldvppMalloc(&inDevBuffer_, inBufferSize); // 将输入图片读入内存中,该自定义函数ReadPicFile由用户实现 ReadPicFile(picName, inDevBuffer_, inBufferSize); } // 6. 申请解码输出内存decodeOutDevBuffer_ // 预估JPEGD处理结果所需的内存大小 uint32_t decodeOutBufferSize = 0; ret = acldvppJpegPredictDecSize(inputHostBuff, inDevBufferSize, PIXEL_FORMAT_YVU_SEMIPLANAR_420,&decodeOutBufferSize) ret = acldvppMalloc(&decodeOutDevBuffer_, decodeOutBufferSize) // 及时释放内存 free(inputHostBuff); // 7. 创建解码输出图片的描述信息,设置各属性值 // decodeOutputDesc是acldvppPicDesc类型 decodeOutputDesc_ = acldvppCreatePicDesc(); acldvppSetPicDescData(decodeOutputDesc_, decodeOutDevBuffer_); acldvppSetPicDescFormat(decodeOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(decodeOutputDesc_, inputWidth_); acldvppSetPicDescHeight(decodeOutputDesc_, inputHeight_); acldvppSetPicDescWidthStride(decodeOutputDesc_, decodeOutWidthStride); acldvppSetPicDescHeightStride(decodeOutputDesc_, decodeOutHeightStride); acldvppSetPicDescSize(decodeOutputDesc_, decodeOutBufferSize); // 8. 执行异步解码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 ret = acldvppJpegDecodeAsync(dvppChannelDesc_, inDevBuffer_, inDevBufferSize, decodeOutputDesc_, stream_); ret = aclrtSynchronizeStream(stream_); // 9. 解码结束后,释放资源,包括解码输出图片的描述信息、解码输出内存、通道描述信息、通道等 acldvppDestroyPicDesc(decodeOutputDesc_); if(runMode == ACL_HOST) { // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存 // 申请Host内存vpcOutHostBuffer void* vpcOutHostBuffer = nullptr; vpcOutHostBuffer = malloc(decodeOutBufferSize); // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host aclRet = aclrtMemcpy(vpcOutHostBuffer, decodeOutBufferSize, decodeOutDevBuffer_, decodeOutBufferSize, ACL_MEMCPY_DEVICE_TO_HOST); // 释放掉输入输出的device内存 (void)acldvppFree(inDevBuffer_); (void)acldvppFree(decodeOutDevBuffer_); // 数据使用完成后,释放内存 free(vpcOutHostBuffer); } else { // 此时运行在device侧,处理结果也在Device侧,可以根据需要操作处理结果后,释放Device侧内存 (void)acldvppFree(inDevBuffer_); (void)acldvppFree(decodeOutDevBuffer_); } acldvppDestroyChannel(dvppChannelDesc_); (void)acldvppDestroyChannelDesc(dvppChannelDesc_); dvppChannelDesc_ = nullptr; // 10. 释放运行管理资源 // 11. AscendCL去初始化 // ....图片缩放的主要代码段// 1.AscendCL初始化 // 2.运行管理资源申请,包括Device、Context、Stream // 3. 创建图片缩放配置数据、指定缩放算法 // resizeConfig_是acldvppResizeConfig类型 acldvppResizeConfig *resizeConfig_ = acldvppCreateResizeConfig(); aclError ret = acldvppSetResizeConfigInterpolation(resizeConfig_, 0); // 4. 创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型 dvppChannelDesc_ = acldvppCreateChannelDesc(); // 5. 创建图片数据处理的通道。 ret = acldvppCreateChannel(dvppChannelDesc_); // 6. 申请输入内存(区分运行状态) // 调用aclrtGetRunMode接口获取软件栈的运行模式,如果调用aclrtGetRunMode接口获取软件栈的运行模式为ACL_HOST,则需要通过aclrtMemcpy接口将输入图片数据传输到Device,数据传输完成后,需及时释放内存;否则直接申请并使用Device的内存 aclrtRunMode runMode; ret = aclrtGetRunMode(&runMode); // inputPicWidth、inputPicHeight分别表示图片的对齐后宽、对齐后高,此处以YUV420SP格式的图片为例 uint32_t resizeInBufferSize = inputPicWidth * inputPicHeight * 3 / 2; if(runMode == ACL_HOST) { // 申请Host内存vpcInHostBuffer void* vpcInHostBuffer = nullptr; vpcInHostBuffer = malloc(resizeInBufferSize); // 将输入图片读入内存中,该自定义函数ReadPicFile由用户实现 ReadPicFile(picName, vpcInHostBuffer, resizeInBufferSize); // 申请Device内存resizeInDevBuffer_ aclRet = acldvppMalloc(&resizeInDevBuffer_, resizeInBufferSize); // 通过aclrtMemcpy接口将输入图片数据传输到Device aclRet = aclrtMemcpy(resizeInDevBuffer_, resizeInBufferSize, vpcInHostBuffer, resizeInBufferSize, ACL_MEMCPY_HOST_TO_DEVICE); // 数据传输完成后,及时释放内存 free(vpcInHostBuffer); } else { // 申请Device输入内存resizeInDevBuffer_ ret = acldvppMalloc(&resizeInDevBuffer_, resizeInBufferSize); // 将输入图片读入内存中,该自定义函数ReadPicFile由用户实现 ReadPicFile(picName, resizeInDevBuffer_, resizeInBufferSize); } // 7. 申请缩放输出内存resizeOutBufferDev_,内存大小resizeOutBufferSize_根据计算公式得出 // outputPicWidth、outputPicHeight分别表示图片的对齐后宽、对齐后高,此处以YUV420SP格式的图片为例 uint32_t resizeOutBufferSize_ = outputPicWidth * outputPicHeight * 3 / 2; ret = acldvppMalloc(&resizeOutBufferDev_, resizeOutBufferSize_) // 8. 创建缩放输入图片的描述信息,并设置各属性值 // resizeInputDesc_是acldvppPicDesc类型 resizeInputDesc_ = acldvppCreatePicDesc(); acldvppSetPicDescData(resizeInputDesc_, resizeInDevBuffer_); acldvppSetPicDescFormat(resizeInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(resizeInputDesc_, inputWidth_); acldvppSetPicDescHeight(resizeInputDesc_, inputHeight_); acldvppSetPicDescWidthStride(resizeInputDesc_, inputWidthStride); acldvppSetPicDescHeightStride(resizeInputDesc_, inputHeightStride); acldvppSetPicDescSize(resizeInputDesc_, resizeInBufferSize); // 9. 创建缩放输出图片的描述信息,并设置各属性值 // 如果缩放的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致 // resizeOutputDesc_是acldvppPicDesc类型 resizeOutputDesc_ = acldvppCreatePicDesc(); acldvppSetPicDescData(resizeOutputDesc_, resizeOutBufferDev_); acldvppSetPicDescFormat(resizeOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(resizeOutputDesc_, resizeOutputWidth_); acldvppSetPicDescHeight(resizeOutputDesc_, resizeOutputHeight_); acldvppSetPicDescWidthStride(resizeOutputDesc_, resizeOutputWidthStride); acldvppSetPicDescHeightStride(resizeOutputDesc_, resizeOutputHeightStride); acldvppSetPicDescSize(resizeOutputDesc_, resizeOutBufferSize_); // 10. 执行异步缩放,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 ret = acldvppVpcResizeAsync(dvppChannelDesc_, resizeInputDesc_, resizeOutputDesc_, resizeConfig_, stream_); ret = aclrtSynchronizeStream(stream_); // 11. 缩放结束后,释放资源,包括缩放输入/输出图片的描述信息、缩放输入/输出内存 acldvppDestroyPicDesc(resizeInputDesc_); acldvppDestroyPicDesc(resizeOutputDesc_); if(runMode == ACL_HOST) { // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存 // 申请Host内存vpcOutHostBuffer void* vpcOutHostBuffer = nullptr; vpcOutHostBuffer = malloc(resizeOutBufferSize_); // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host aclRet = aclrtMemcpy(vpcOutHostBuffer, resizeOutBufferSize_, resizeOutBufferDev_, resizeOutBufferSize_, ACL_MEMCPY_DEVICE_TO_HOST); // 释放掉输入输出的device内存 (void)acldvppFree(resizeInDevBuffer_); (void)acldvppFree(resizeOutBufferDev_); // 数据使用完成后,释放内存 free(vpcOutHostBuffer); } else { // 此时运行在device侧,处理结果也在Device侧,可以根据需要操作处理结果后,释放Device侧内存 (void)acldvppFree(resizeInDevBuffer_); (void)acldvppFree(resizeOutBufferDev_); } // 12. 释放运行管理资源 // 13. AscendCL去初始化 // ....参考案例参考代码仓的图像处理文件夹:https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/0_data_process/链接中的jpegd(图像解码)、jpege(图像编码)、resize(图像大小改变)等等还有很多好玩的参考代码都可以参考学习基于Caffe ResNet-50 网络实现图片分类(图片解码+抠图缩放+图片编码+同步推理):https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/1_classification/vpc_jpeg_resnet50_imagenet_classification
  • [热门活动] 进阶班应用开发课-P1-学习笔记
    下面都是一些总结与截图:首先说总结:一、您是否适合应用开发课?从这视频https://www.bilibili.com/video/BV1hS4y1D7TW 可以知道1、已经学过相关知识的同学,可以选这个课程2、想了解媒体数据处理器的同学,可以选这个课程3、了解过媒体处理器,但不知道怎么在昇腾使用的同学,可以选这个课程二、学习目标1、就是什么是媒体处理器?有啥用?2、怎么用媒体处理器?3、用媒体处理器怎么排除问题?下面就是主要的内容----三、媒体处理器是什么?          经过学习,我们会发现,在特定模型训练的时候,我们要求训练数据集是一定的要求。但实际上的训练集会和我们所需要的不同,我们我们需要一种算子,把实际的训练数据转化为我们想要的训练数据;所以就引入了媒体处理器了。当然也不定什么格式都是能转的,华为给出了媒体处理器的一些功能如下面所示:知道媒体器在干嘛之后(我觉得具体细节不用追究,太菜了),然后我们得知道,在得到实际得训练数据之后,我们怎么用媒体处理器转换成理想得训练数据这里还没学到,要知道得是,在训练模型时候,就得调用数据媒体器处理就好了。四、遇到问题怎么办?---当然问(提问呀)1、基于gitte上,在CANN Sample 仓提交 Issue;也在 ModelZoo 仓上提 Issue,该仓的接口人会定期处理问题2、 也可在昇腾社区论坛中查阅经验贴、或者发求助帖进阶班应用开发课第一节学习就到此了,有一些问题还没讲到,期待各位的指导。
  • [技术干货] VLC 3.0.16(aarch64)编译指导 for openEuler 20.03 LTS SP1
    1 简介VLC是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及DVD、音频CD、VCD及各类流媒体协议。可以播放MPEG-1、MPEG-2、MPEG-4、DivX、DVD/VCD、卫星数字电视频道、地面数字电视频道(digital terrestrial television channels)、在许多作业平台底下透过宽带IPv4、IPv6 网络播放线上影片。VLC支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。VLC也能作为unicast或multicast的流式服务器在IPv4或IPv6的高速网络连接下使用。VLC融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体文件及加密DVD影碟的功能。官方链接: http://www.videolan.org/类别:播放器语言:C/C++/Objective-C/QML/Lua2 环境类别子项版本获取地址(方法) 硬件CPUIntel 5218iBMC网络Ethernet-10GEiBMC存储SATA 4TiBMC内存xxG xxxMHziBMCOSopenEuler20.03 LTS SP1cat /etc/os-releaseKernel4.19.90cat /proc/version软件GCC7.3.0参考下面安装说明 gcc -vOpenJDK 1.8.0_272参考下面安装说明VLC3.0.16参考下面安装说明3 系统依赖安装3.1 配置本地yum源注:系统联网情况下,此步骤可忽略。挂载OS镜像:mkdir /mnt/iso/mount -o loop /home/openEuler-20.03-LTS-SP1-everything-aarch64-dvd.iso /mnt/iso/执行mv /etc/yum.repos.d /etc/yum.repos.d.bak备份默认yum源,然后mkdir /etc/yum.repos.d/创建/etc/yum.repos.d/路径,执行vim /etc/yum.repos.d/local.repo文件,配置yum本地源:[local]name=localbaseurl= file:///mnt/isogpgcheck=0enabled=1运行下面的命令,使yum源配置生效:yum clean allyum makecache3.2 安装GCC等相关依赖yum安装GCC、alsa、yasm等相关依赖:sudo yum install -y gcc gcc-c++ gcc-objc++ alsa* libxml2-devel yasm nasm lua* libmodplug libmpg123 libnfs libxcb-devel libxcb snappy snappy-devel autoconf automake libtool git make cmake openssl openssl-devel zlib zlib-devel bzip2 bzip2-devel bzip2-libs readline readline-devel bison zip unzip tar tcl java-1.8.0* bison* ncurses* wget4 编译依赖安装4.1 编译安装ffmpeg-4.01、进入/hom目录获取ffmpeg-4.0源码cd /home/wget https://www.ffmpeg.org/releases/ffmpeg-4.0.tar.gz注:如果系统环境无法联网,则手动单击链接https://www.ffmpeg.org/releases/ffmpeg-4.0.tar.gz下载安装包,并上传到系统的/home/目录下。2、安装ffmpeg-4.0tar xf ffmpeg-4.0.tar.gzcd /home/ffmpeg-4.0CFLAGS=-fPIC ./configuremake -j 64make install -j 643、设置PKG_CONFIG_PATH环境变量在/etc/profile最后一行增加如下内容export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH然后执行source /etc/profile使环境变量生效。 4.2 编译安装a52dec-0.7.41、进入/hom目录获取a52dec-0.7.4源码cd /home/wget https://liba52.sourceforge.io/files/a52dec-0.7.4.tar.gz注:如果系统环境无法联网,则手动单击链接https://liba52.sourceforge.io/files/a52dec-0.7.4.tar.gz下载安装包,并上传到系统的/home/目录下。2、修改autotools/config.sub适配aarch64架构vim autotools/config.sub a.修改下述内容,第263行| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \修改后为:| x86 | aarch64 | xscale | xscalee[bl] | xstormy16 | xtensa \b.修改下述内容,第331行| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \修改后为:| x86-* | aarch64-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \3、安装a52dec-0.7.4tar xf a52dec-0.7.4.tar.gzcd /home/a52dec-0.7.4CFLAGS=-fPIC ./configure --enable-sharedmake -j 64make install -j 645 编译安装1、下载VLC 3.0.16源码wget http://get.videolan.org/vlc/3.0.16/vlc-3.0.16.tar.xztar xf vlc-3.0.16.tar.xz注:如果系统环境无法联网,则手动点击http://get.videolan.org/vlc/3.0.16/vlc-3.0.16.tar.xz下载vlc-3.0.16.tar.xz后传到系统/home/路径下。2、进入解压目录cd vlc-3.0.16/3、定义临时PKG_CONFIG_PATH变量export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH4、执行./bootstrap./bootstrap5、执行./configure./configure6、执行make或./compile编译make -j 647、执行make install编译安装make install -j 64  6 验证1、创建非root用户,以vlc为例useradd vlc2、切换到vlc用户su vlc3、查看vlc版本vlc --version注:更多帮着查看vlc --help4、使用vlc播放视频vlc ./xxx.mp4注:需要在桌面环境下执行(无桌面环境会报“window not available”错误),xxx.mp4为视频文件,如果不在当前路径则需要带绝对路径。7 参考信息http://www.videolan.org/https://github.com/videolan/vlc  8 FAQ1、编译ffmpeg-4.0报nasm/yasm not found or too old错误【详细描述】:编译ffmpeg-4.0执行./configure报nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.错误,详细报错如下:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.If you think configure made a mistake, make sure you are using the latestversion from Git.  If the latest version fails, report the problem to theffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.Include the log file "ffbuild/config.log" produced by configure as this will helpsolve the problem.解答:方法1:先执行yum -y install yasm或yum -y install nasm安装yasm或nasm然后再次执行./configure方法2:直接执行./configure --disable-x86asm 2、编译vlc 3.0.16执行make过程报relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol等错误【详细描述】:执行make过程报relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol等错误,具体报错如下:/usr/bin/ld: /usr/local/lib/libavutil.a(log.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `stderr@@GLIBC_2.17' which may bind externally can not be used when making a shared object; recompile with -fPIC/usr/bin/ld: /usr/local/lib/libavutil.a(log.o)(.text+0x28): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `stderr@@GLIBC_2.17'/usr/bin/ld: final link failed: bad valuecollect2: error: ld returned 1 exit statusmake[4]: *** [Makefile:18807: libswscale_plugin.la] Error 1make[4]: *** Waiting for unfinished jobs..../usr/bin/ld: /usr/local/lib/libavformat.a(md5proto.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `stdout@@GLIBC_2.17' which may bind externally can not be used when making a shared object; recompile with -fPIC/usr/bin/ld: /usr/local/lib/libavformat.a(md5proto.o)(.text+0xc0): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `stdout@@GLIBC_2.17'/usr/bin/ld: final link failed: bad valuecollect2: error: ld returned 1 exit statusmake[4]: *** [Makefile:14981: libavio_plugin.la] Error 1make[4]: Leaving directory '/home/vlc-3.0.16/modules'make[3]: *** [Makefile:28009: all-recursive] Error 1make[3]: Leaving directory '/home/vlc-3.0.16/modules'make[2]: *** [Makefile:12802: all] Error 2make[2]: Leaving directory '/home/vlc-3.0.16/modules'make[1]: *** [Makefile:1559: all-recursive] Error 1make[1]: Leaving directory '/home/vlc-3.0.16'make: *** [Makefile:1446: all] Error 2解答:1)、重新编译ffmpeg-4.0,先执行CFLAGS=-fPIC ./configure,然后支持make && make install编译;2)、然后重新编译vlc 3.0.16,先执行./bootstrap,接着执行./configure,然后支持make && make install编译。