教你如何截取视频制作表情包

2020-12-11 21:37:38 浏览数 (1)

背景

一天,小罗妹妹在家看着综艺节目,为自己家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 命令行的方式运行。

而第三方云服务,使用起来更方便,小白也能直接上手,可以很快速就实现该功能,后期维护存档也更容易,无论是个人使用还是企业使用或者产品有需求,都可以依赖第三方服务来实现。

本文的视频截取制作表情包,只是云点播里的一个小小功能,云点播还有许多功能使用未说明,小编就留到下次介绍了,感谢各位看官看到这里,下次见~

0 人点赞