背景
一天,小罗妹妹在家看着综艺节目,为自己家idol 坤坤哥哥,疯狂打call,被里面的节目效果,逗得捧腹大笑,这时看到了坤坤哥哥特别好笑的一个动作表情,想要保存下来,和朋友分享,怎么办呢,小罗妹妹非常苦恼,
有没有方便的工具能帮帮小罗妹妹呢
答案:肯定有的,接下来我们看下如何截取视频做成动图的效果,使用的工具和产品 工具:FFmpeg 产品:腾讯云点播
解决方案
1、 FFMPEG
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源框架(https://ffmpeg.org/)
那么FFmpeg 是怎么处理视频转动图的呢?以上面小罗的场景为例说明:
1) 首先将所有支持的多媒体格式,编解码器注册(av_register_all);
2) 将综艺节目视频下载下来后,打开处理的视频(avformat_open_input);
3) 视频主要有视频音频组成,制作动图需要对视频进行处理,所以先将视频分解成视频数据和音频数据,获取要处理的视频流(av_find_best_stream);
4) 寻找调用流适合的编解码器来对视频进行处理(avcodec_find_decoder );
5) 新建一个编解码器上下文实例来处理视频流数据的输入输出(avcodec_alloc_context);
6) 将输入视频流的参数,例如用到的编解码器、音视频流等,复制到编解码上下文实例(avcodec_parameters_to_context);
7) 接下来在上下文实例上打开输入流的编解码器(avcodec_open2);
8) 对视频数据每一帧画面循环读取(av_read_frame),直到我们想要的截取片段开始结束时间,进行截取视频数据;
9) 最后用输入视频流的编解码器解析后,调用输出的编解码器转编码封装(av_guess_format),最后生成动图文件。
像上面小罗的例子,需要从22s开始截取视频test.mp4的3s数据,FFmpeg转动图命令如下:
ffmpeg -ss 00:00:22 -t 3 -i test.mp4 test.gif 其中, -ss 指定从视频什么时候开始 -t 截取指定时间开始后多少秒的视频数据
-r 指定帧率,帧率越高越流畅。
-I 指定要处理的视频
2、腾讯云点播控制台
控制台操作:
步骤一:首先需要在控制台开通腾讯云点播服务 https://console.cloud.tencent.com/vod/overview
步骤二:创建任务流,填写名称,勾选任务类型配置(转动图),选择转动图模板Id(系统预设好的转动图模板Animated-GIF(20000)),最后再修改好要截取视频中对应的片段,点击提交就创建好了。
步骤三:进入媒资管理--》视频管理--》上传视频,选中要处理的视频,填写视频名称,上传后自动进行视频处理,任务类型(任务流),任务流模板(刚刚创建好的任务流),点击开始上传。
步骤四:进入媒资管理--》视频管理,找到对应上传文件,点击右侧“管理”跳转后,选择“截图信息”,查看转动图文件,点击右侧预览可以看到效果,或者复制链接发送朋友。
3、腾讯云点播API方式
使用腾讯云点播API主要用到两个接口和在线接口调试工具:
1) 视频处理(ProcessMedia) :https://cloud.tencent.com/document/product/266/33427
主要用到参数如下
参数名称 | 类型 | 描述 |
---|---|---|
FileId | String | 媒体文件 ID,即该文件在云点播上的全局唯一标识符,在上传成功后由云点播后台分配。 |
MediaProcessTask | MediaProcessTaskInput | 视频处理类型任务参数。这里选择 AnimatedGraphicTaskSet (转动图) |
接口参数MediaProcessTask中AnimatedGraphicTaskSet 类型(视频转动图任务列表):参数如下
参数名称 | 类型 | 描述 |
---|---|---|
Definition | Integer | 视频转动图模板 ID |
StartTimeOffset | Float | 动图在视频中的开始时间,单位为秒。 |
EndTimeOffset | Float | 动图在视频中的结束时间,单位为秒。 |
Definition 参数值模板ID,这里使用的是系统预设模板Id (20000),也可以自定义创建
(https://console.cloud.tencent.com/vod/video-process/template/gift)
2) 查询任务详情(DescribeTaskDetail)https://cloud.tencent.com/document/product/266/33431
主要用到参数如下
参数名称 | 类型 | 描述 |
---|---|---|
TaskId | String | 视频处理任务的任务 ID。 |
3) 在线接口调试工具:
ProcessMedia :
https://console.cloud.tencent.com/api/explorer?Product=vod&Version=2018-07-17&Action=ProcessMedia&SignVersion= DescribeTaskDetail :
https://console.cloud.tencent.com/api/explorer?Product=vod&Version=2018-07-17&Action=DescribeTaskDetail&SignVersion=
步骤一:首先需要在控制台开通腾讯云点播服务,并获取到API 密钥到后面步骤使用
https://console.cloud.tencent.com/cam/capi
步骤二:上传视频获取FileId 上传视频:https://console.cloud.tencent.com/vod/media/upload 在视频管理找到对应的FileID:https://console.cloud.tencent.com/vod/media
步骤三:调用 ProcessMedia 接口(视频处理)
选择在线调用发送请求后,返回TaskId,记录下来
调用实例代码(JAVA)
代码语言:javascript复制
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.*;;
public class ProcessMedia
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("vod.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
VodClient client = new VodClient(cred, "", clientProfile);
ProcessMediaRequest req = new ProcessMediaRequest();
MediaProcessTaskInput mediaProcessTaskInput1 = new MediaProcessTaskInput();
AnimatedGraphicTaskInput[] animatedGraphicTaskInputs1 = new AnimatedGraphicTaskInput[1];
AnimatedGraphicTaskInput animatedGraphicTaskInput1 = new AnimatedGraphicTaskInput();
animatedGraphicTaskInput1.setDefinition(20000L);
animatedGraphicTaskInput1.setStartTimeOffset(22F);
animatedGraphicTaskInput1.setEndTimeOffset(25F);
animatedGraphicTaskInputs1[0] = animatedGraphicTaskInput1;
mediaProcessTaskInput1.setAnimatedGraphicTaskSet(animatedGraphicTaskInputs1);
req.setMediaProcessTask(mediaProcessTaskInput1);
req.setFileId("5285890811181431718");
ProcessMediaResponse resp = client.ProcessMedia(req);
System.out.println(ProcessMediaResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
步骤四:调用查询任务详情接口(DescribeTaskDetail)获取动图, 下图参数Type类型为AnimatedGraphics(转动图) 中的 Output 参数值就是处理后动图的地址。
示例代码(JAVA)
代码语言:javascript复制
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.*;;
public class DescribeTaskDetail
{
public static void main(String [] args) {
try{
Credential cred = new Credential("SecretId", "SecretKey");
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("vod.tencentcloudapi.com");
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
VodClient client = new VodClient(cred, "", clientProfile);
DescribeTaskDetailRequest req = new DescribeTaskDetailRequest();
req.setTaskId("TaskId");
DescribeTaskDetailResponse resp = client.DescribeTaskDetail(req);
System.out.println(DescribeTaskDetailResponse.toJsonString(resp));
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
}
}
}
拿到地址复制打开后就能收藏起来,愉快斗图啦
源视频:
http://1500000183.vod2.myzijiebao.com/6c977614vodcq1500000183/f7a644a65285890811181431718/Noyx6vSBnbUA.mp4
动图:
http://1500000183.vod2.myzijiebao.com/438163bcvodtranscq1500000183/f7a644a65285890811181431718/animatedGraphics/v.f39615.gif
小结
对比以上两种方案,
FFmpeg 需要有一定技术背景,在搭建好环境并熟悉命令后,以ffmepg 命令行的方式运行。
而第三方云服务,使用起来更方便,小白也能直接上手,可以很快速就实现该功能,后期维护存档也更容易,无论是个人使用还是企业使用或者产品有需求,都可以依赖第三方服务来实现。
本文的视频截取制作表情包,只是云点播里的一个小小功能,云点播还有许多功能使用未说明,小编就留到下次介绍了,感谢各位看官看到这里,下次见~