开发者学堂课程【视频云技术入门-1024程序员节创造营公益课:智能媒体生产 ICE 使用及实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/902/detail/14332
智能媒体生产 ICE 使用及实战
目录:
一,时间线简介
二,Timeline 数据结构
三,制作卡点相册
四,代码实战
一, 时间线简介
时间轨道:
Track(轨道)
轨道是多个素材片段按照一定顺序组成的序列,轨道类型包含视频轨、音频轨、字幕轨,每种轨道可以包含多条,按照层叠顺序
福益,多条轨道可以同时播放。
Clip(素材片段)
Clip 是对一个片段的描述,标注了一个素材在时间线上的位置,在画布中的坐标、尺寸等信息。
Effect(特效)
特效包括转场、滤镜、特效,一个 Clip 可以包含多个 Effect。
二,Timeline 数据结构
VideoTrackClip
Type: lmage
关键信息:Duration、Timelineln、TimelineOutx、 Y、 Width、Height
Type: Video
关键信息:In、Out、Timelineln、TimelineOutx、 Y. Width、Height
SubtitleTrackClipType: Subtitle
关键信息:FileURL
AudioTrackClip
关键信息:MediaURL/Medialdln、Out、Timelineln、TimelineOut
Effect
关键信息:Type.Timelineln、TimelineOut
三,制作卡点相册
时间线分析:
视频轨
由多张图片组成的 Clip 序列,每个 Clip 按照顺序恰好落在节拍的开始结束。
音频轨
音频轨只有一个 Clip,即带节奏的背景音乐。
制作流程:
第一步:获取节奏信息
调用 SubmitlProductionJob 接口,提交节奏检测任务
调用 QuerylProductionJob 接口,获取任务状态,等待任务执行完成
第二步:封装时间线
读取智能任务结果
据节奏信息封装时间线
第三步:合成视频
调用 SubmitMediaProducingJob 接口,提交剪辑合成任务
调用 GetMediaProducingJob,等待合成任务完成
获取音乐节奏信息
提交智能生产作业 SubmitMediaProducingJob
参数名称 |
示例值 |
FunctionName |
AudioBeatDetection(节奏检测) |
lnput |
oss://your-bucket.oss-cn-shanghai.aliyuncs.com/music.mp3 |
Output |
oss://your-bucket.oss-cn-shanghai.aliyuncs.com/output.txt |
输出:Jobld
查询智能生产作业 QuerylProductionJob
参数名称 |
示例值 |
Jobld |
******85f8cf40c086daf6e971****** |
输出:Job 信息(包含智能任务结果)
封装时间线:
从音乐节奏信息到时间线
音乐节奏信息如下
{
“resul
t
" :"success"",
“BeatList":[ 0.04", "o.82", "1.61",“2.38",
“
-3.17."3.96","4.74",”5.53"~..].
“DownBeatList": [ "o.04", ""3.17-, "6.3".
-9.42-,“12.56-, -i5.7-.“18.83- ..]
}
时间线信息如下
{
“videoTracks" : [ {
"vidcoTrackciips" : [ {
“
MediauRE": "https : //your-bucket.oss=Cn-shanghai.aliyuncs.com/image.jpg","Type": "Image".
" Duration": -o.04”},{
""MediaURL":"https://your-bucket.oss-cn-shanghai.aliyuncs.com/image.jpg",“Type": “Image"".
-Duration-: -0.82”},{
""MediaURL": "https: //your-bucket.oss=Gn-shanghai.aliyuncs.com/image.jpg"“Type":“工mage".
Duration-:“ 1.61”},{
""MediaURL": "https: /lyour-bucket.oss=Cn-shanghai.aliyuncs.com/image.jpg","Type" : Image"".
Duration-: " 2.38-
1
》
1,
AudioTracks": [{
”
AudioTrackciips": [ {
"MediaURL": "https: //your-bucket.oss=Cn-shanghai.aliyuncs.com/music.mp3"
}
]
}
]
}
合成视频
提交剪辑合成作业 SubmitMediaProducingJob
参数名称 |
示例值 |
Timeline |
{"VideoTracks":[...],"AudioTracks":[...]} |
OutputMediaConfig |
{"MediaURL"."https://your-bucket.oss-cn-shanghai.aliyuncs.com/video.mp4"} |
输出: Jobld
查询剪辑合成作业 GetMediaProducingJob
参数名称 |
示例值 |
Jobld |
****** 85f8cfA0r086daf6e971****** |
输出: Job 信息
添加转场效果
四,代码实战
第一步:提交节奏检测任务
//提交节奏检测任务
com.aliyun.mts20140618.Client client = createMpsClient();
SubmitIProductionJobRequest = new SubmitIProductionJobRequest();submitIProductionJobRequest.setFunctionName("AudioBeatDetection");
submitIProductionJobRequest.setInput("oss:;//oushu-test-shanghai.oss-cn-shanghai.alixunes.con/test.media/luffoato. VansinJapan.mp8 ) ;
submitIProductionJobRequest.setlutput( "oss://oushu-test-shanghai.oss-cn-shanghai.alixwncs.col/ionoduatico/isource)-{timestamp;.t )SubmitIProduction3obResponse submitIProductionJobResponse = cient.submitIProductionJob(submitIProdvctionJobRoquest);
//等待任务完成
String jobId = submitIProductionJobResponse.body.jobId;String result;
while (true) {
QueryIProductionJobRequest = new QueryIProductionJobRequest();queryIProductionJobRequest.setJobId(jobId);
QueryIProductionJobResponse = client.queryIProduction.Job(queryIProductionJobRequest);System.out . println( "out : " +JSONObject.to3SONString(queryIProductionJobResponse.body));
if ("Success".equals(queryIProductionJobResponse.body.state)){
result = queryIProductionJobResponse.body.result;
break;
}
Thread.sleep( millis: 5888);
}
第二步:根据节奏点的任务拼装出时间线
//获取节奏检测任务结果
string file = 130M0boject.,parseCbiject(00Mbject.yausebfjetoneslt).,gtString( toy "nat '. etoNSoMAray( twy "'renot ).getosSoDbject( inox a,).pestrung、 nl"ne ,;System.out.println( ""result file :" +file);
String resultcontent = get0bjectcontent(file);
System.out.println("result content : " +resultContent);
JSONArray beatList = 3SONObject.parseObject(resultContent).getJSONArray( key:"BeatList");
//封装时间线
String[] imageUrls = new String[]{
"httos://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/test media/pno_pic1/1.ina"."https://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/test_media/pro.pic1/3.jpg"."httos:l/oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/test media/pro pic1/6.jng".,
“
httos:L/oushu-test-shanghai.oss-Cn-shanghai.aliyuncs.com/test media/pro pic1/7.1ipna","httos://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/test media/pro pic1/8.ing","https://oushu-test-shanghai.oss-cn-shanghai.aliyuncs.com/test.media/pro.pic1/10.jp9","https:Lloushu-test-shanghai.oss-Cn-shanghai.aliyuncs.com/test medialpro pic1/13.jpg",
;
JSONArray videoTrackClips = new JSONArrayO;float transitionDur =0.3f;
for (int i =0;i< imageUrls.length; i++){
String url = imageUrls[il;
JSONObject obj = new JSONObjectO;
String duration = beatList.getString(i);obj.put( "MediaURL",url);
obj.put("Duration",Float.parseFloat(duration)+ transitionDur);obj.put("Type", "Image");
if (Float.parseFloat(duration) > transitionDur)i
obj.put("Effects",JSOMAIvay.panse(taxc “"[('Typel':Transition" , "SubTypel:'gneayzo.m(", Duration)':" + transitionDu + })'>);
}
videoTrackClips.add(obj);
}
strtng tlmeLne = " (lVldoiracks):4(1 YdoincLiosl" " + vlooirocuios .tousNStelng() + ")],AMAudtofracks)" !fi1M wudoTraekCALpos " ![4/"MctoURL :/'ittosllushv-toSystem.out.println( "timeline : " +timeline);
}
第三步;拼装时间线合成任务
//提交合成任务
SubmitNediaProducingJobRequest submitNediaProducing3obRequest = new SubmitNediaProducing3obRequest();submitHediaProducingJobRequest.setTimeline(timeline);
String outpiptPath = IceUtil.getRandomoutputPathO;
String mediaURL = "https://oushu-test-shanghai.oss-cn-shanghai.aliyuncs .com/" + outputPath + ".mp6";
submitHNediaProducingJobRequest.setoutputNediaConfig(" A "NediaURLA": ""+mediaURL +"V , "Iiath\":1280, "Hedght\":720) ");client iceclient = TestclientInstance.getInstance().getIceclient(;
$ubnitlediaProducingpJobResponse subwitlediaProdcingJobResponse = iceCLient.submitNediaProdvcingJob(submithediaProdvcinglobRequest);
Systen ovt.p intu( fjo crate ,jold : ' o* sutaithdiolProducingloblesyos.boy .j oud ", nwepnstid : " + stbitlediaProdvein otbespons.oy.getileoustd() , med.
//等待合成任务完成
while (true){
GetWediaProducingJobRequest getMediaProducingJobRequest = new GetHediaProducingJobRequest();getNediaProducingJobRequest.setJobId(submitHediaProducingJobResponse.body.jobId);
GethediaProducingJobResponse getlediaProdvcing.obResponse m iceCLient. gethediaProducingJob(getMediaProducingJobRequest)System.out.pointin(“GetMediaProducingJobResponse : " + JS0NObject.to.7sONString( getMediaProdvcingJobResponse.body>);
String status = getHediaProducingJobResponse.getBody().getHediaProducingJob().getStatus();
if(""Success".equals(status)){
break;
,
Thread.sleep( millise :5888);
}
system.out.println("Produce succeed :" + mediaURL);
}