前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >教你如何截取视频制作表情包

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

原创
作者头像
林俊标-pjblin
发布2020-12-11 21:37:38
7.2K0
发布2020-12-11 21:37:38
举报

背景

一天,小罗妹妹在家看着综艺节目,为自己家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.myqcloud.com/6c977614vodcq1500000183/f7a644a65285890811181431718/Noyx6vSBnbUA.mp4

动图:

http://1500000183.vod2.myqcloud.com/438163bcvodtranscq1500000183/f7a644a65285890811181431718/animatedGraphics/v.f39615.gif

小结

对比以上两种方案,

FFmpeg 需要有一定技术背景,在搭建好环境并熟悉命令后,以ffmepg 命令行的方式运行。

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 解决方案
    • 1、 FFMPEG
      • 2、腾讯云点播控制台
        • 3、腾讯云点播API方式
        • 小结
        相关产品与服务
        云点播
        面向音视频、图片等媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档