Android 短视频 SDK 转场特效的音视频同步分析

在短视频的应用场景中,经常存在用户拍摄的两个或者多个视频生成一个视频的需求,为了达到两个视频平滑过渡,就需要在两个视频中间添加转场效果。

由于导入视频的帧率、码率等参数都不一致,如何保证在添加完转场效果后音视频同步?

本文主要介绍转场效果的实现及如何保证最终合成视频的音视频同步,同时简单介绍一下转场滤镜。

作者:金山视频云 

链接:https://www.jianshu.com/p/5eef175a8cb8

一. 转场功能介绍

市面上的转场基本分为三类:

  1. 片头片尾转场:即只作用在一个视频上。

此种和普通的时间滤镜添加区别不大,并不复杂,本文不再赘述

  1. 非重叠转场:转场接替作用在第一个视频的最后和第二个视频的开始,两个视频是顺次拼接。

比如持续1s的blur转场,blur滤镜 在第一个视频的最后0.5s开始,直到结束,作用是由清晰变模糊;在第二个视频的开始作用,持续0.5s,作用是由模糊变清晰。

  1. 重叠转场:转场叠加作用在第一个视频的最后和第二个视频的开始,两个视频有一个转场时间的重叠区。

比如持续1s的 淡入淡出转场,淡入淡出滤镜接收两个视频输入源,并且从第一个视频的最后1s开始作用,即在第一个视频的最后1s需要同时启动第二个视频的解码,并将解码后的数据输入到滤镜中,在转场的持续时间内是同时叠加了两个视频数据。

二. 转场方案介绍

转场是在时间上对多个视频做转码和拼接。

我们采取的方案如如下图所示,依次对待拼接文件做解码,输出音频采样和视频像素数据到编码器,经过muxer最终将不同帧率、码率的视频生成统一格式的文件。

eb170c5447372bf06f315a6b6550e9fc.png

上图中AVMediaCapture为demuxer和decoder的封装。

如第一章节的介绍转场同一时间最多作用在两个视频上,因此只需要创建两个AVMediaCapture的实例,第一个视频解码结束后,第三个视频可以使用第一个视频创建的AVMediaCapture,依次类推,避免反复创建造成资源浪费。

如下图所示:

a5b626d0801c8e373cda14d8ef8a9d69.png

而对于AVMediaCapture中的解码器(硬解为例),也不需要反复创建,我们来看官网上关于MediaCodec的生命周期:

224bcdeb20f0da081a6a66b89eaaabed.png

如上图所示,当一个文件解码完成以后,通过reset接口使解码器处于Uninitialized状态,当对第二个文件进行解码时,只需要重新configure,start即可。

三. 转场中的音视频pts 计算

3.1 非重叠转场

在两个视频之间添加持续时间 trans_t 的转场滤镜,滤镜在第一个视频 [dur_0 - trans_t / 2.0f] 开始作用,直到第一个视频结束,然后继续在第二个视频的开始作用,持续 [trans_t / 2.0f]。

pts 依次是之前视频时长的累加,公式如下:

vTrack_1 和 aTrack_1 开始点的 pts : [0 + dur_0];

vTrack_2 和 aTrack_2 开始点的 pts : [dur_0 + dur_1]。

vTrack_n 和 aTrack_n 开始点的 pts : [dur_0 + dur_1 + ... + dur_n]。

d728e33ad39cbe83cc8f35ae066b2065.png

3.2 重叠转场

在两个视频之间添加持续时间 trans_t 的转场滤镜,滤镜是同时作用在两个视频上的,因此滤镜在第一个视频的 [dur_0 - 1.0f] 时开始作用,直到第一个视频结束,同时开始第二个视频的解码,并作为滤镜的第二视频输入源。

pts 的计算需要将转场的作用时间裁剪掉,公式如下:

vTrack_1 和 aTrack_1 开始点的 pts: [0 + dur_0 - trans_t];

vTrack_2 和 aTrack_2 开始点的 pts: [dur_0 + dur_1 - 2 * trans_t]。

vTrack_n 和 aTrack_n 开始点的 pts: [dur_0 + dur_1 + ... + dur_n - n * trans_t]

9e63dbe7db9a063ada1ca4509c6ef632.png

四. 转场中的音视频同步

因为采用的是pull的方式从解码向编码输入数据,因此在添加重叠场景的转场时,在转场的时间段内,同时存在2个音频轨道和2个视频轨道,就需要考虑四个轨道的同步问题

  • 单个视频的音视频解码同步

重叠场景的转场,若音视频 demuxer 相差很大,比如第一个视频的音频已经 demuxer 结束,但是第一个视频的视频还在继续处理,因为同时开启了第二个视频的 demuxer ,所以会有累加的音视频不同步的情况。

353e916ae2c4b69e79b831983fe63f38.png

如上图所示,在 decoder 之后添加AVSync模块以解决此种情况的不同步问题,AVSync模块采用视频驱动音频的同步模式,即,对音频做缓存,以视频帧驱动音频帧向下传递,threshold 不超过100ms。

  • 两个视频之间的视频解码同步

重叠场景下,转场滤镜需要同时输入两个视频源,若第一个视频解码速度快,但是第二个视频的解码速度慢,会造成某一帧数据中只有第一个视频,并没有第二个视频,或者滤镜已经持续了0.8s了,第二个视频才有了输入,造成整体的转场效果较差。

c451182a850ab1161f79d95e2beb4716.png

为了解决此种问题,加入 VTracks_Sync 同步模块, Vtracks_Sync 保证两个视频的 pts 的diff在100ms之内,若 vtrack_0_pts – vtrack_1_pts > 100ms, 则对 vtrack_0 的 demuxer 做暂停,反之对 vtrack_1 的 demuxer 做暂停,以达两个视频源的同步

五. 转场滤镜

重叠转场的渐变滤镜,基本方案为 以vtrack_0 为滤镜的主视频输入源 sTexture ,以 vtrack_1 为滤镜第二个视频输入源 vTexture1 ,在 shader 中通过修改渐变因子,以达到不同输入源的比重不同。

以最简单的淡入淡出滤镜为例,offset 为渐变因子,例如持续时间为1s的转场,则offset在1s内从0渐变到1,作用到视频帧的单位值计算公式:[offset_maxvalue / offset_maxcount]

offset_maxvalue为渐变因子的最大值,即1

offset_maxcount为作用帧数,以帧率是20为例,1s的转场,offset_maxcount即为20。

void main()       
{vec4 video = texture2D(sTexture, vTextureCoord);vec4 screen = texture2D(vTexture1, vTextureCoord);  gl_FragColor = mix(video, screen, offset);
};

mix是对video和screen做线性混淆,即gl_FragColor = video(1- offset) + (screen * offset)

最后欢迎大家加入 音视频开发进阶 知识星球 ,这里有知识干货、编程答疑、开发教程,还有很多精彩分享。

更多内容可以在星球菜单中找到,随着时间推移,干货也会越来越多!!!

f0ef6ac33c144b8467eb00cb3853b39b.png

给出 10元 优惠券,涨价在即,目前还是白菜价,基本上提几个问题就回本,投资自己就是最好的投资!!!

39f54bf660e4ee448724e90446d1f901.png

加我微信 ezglumes ,拉你进技术交流群

推荐阅读:

音视频开发工作经验分享 || 视频版

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

Android NDK 免费视频在线学习!!!

你想要的音视频开发资料库来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

98c1a0c028036e41b813a0b0636414be.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/61017.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub怎样快速更换绑定邮箱(简单实用)

1、登录GitHub 2、点开自己的头像 3、点Settings 4、点击Emails 5、Add email address, 填入你想用的新邮箱 6、新邮箱收到验证邮件 ,验证之后,回到github ,把新邮箱Set Primary

修改Git上的用户名和邮箱

1、打开GitBash 2、输入可以看到自己的邮箱和用户名 git config --list 3、使用这行命令修改你的邮箱 git config --global --replace-all user.email “你的邮箱” 4、使用这行命令修改你的用户名 git config --global --replace-all user.name “你的用户名”

分享一个可以批量换绑百度账号绑定邮箱+批量修改密码的软件

之前做过贴吧,经常需要入手大量的百度号,因此给账号换绑邮箱(防止扫号)、修改密码就成了一件繁重的工作。也曾经因为偷懒,购买之后没有及时换绑邮箱,很快就被不良卖家把号扫回去了,损失惨重&…

修改git全部已提交的用户名和邮箱

原文的link:http://dangzhiqiang.blog.51cto.com/7961271/1657864 即:修改git所有commit中的用户名和email 作为一名 Git 苦手,我一直使用的是傻瓜级的 Github 客户端,去年九月迁移到 OS X 后也是如此。好几个月后我发现自己的 co…

怎样修改git用户名、密码和邮箱?

如何查看git用户名? 命令如下: git config user.name 如何查看git密码? 命令如下: git config user.password 如何查看git邮箱地址? 命令如下: git config user.email 如何修改git用户名?…

git设置查看修改用户名和邮箱

1.设置 修改用户名 git config --global user.name "xxxx(新的用户名)" 修改密码 git config --global user.password "xxxx(新的密码)" 修改邮箱 git config --global user.email "xxxxxxx.com(新的邮箱)" 2.查看 1)通过命令查…

Gerrit(1)绑定自己的邮箱账号

前提条件:安装Git 1、根据公司自己的gerrit地址,配置ssh-key 配置个人信息,登记邮箱地址: 然后系统会发送一封确认邮件,请点击确认: 配置ssh-key: 公钥生成步骤 :(前提条件已安装g…

修改 Git 已经提交记录的 用户名 和邮箱

修改 Git 已经提交记录的 用户名 和邮箱 有关 Git 和版本控制的常见问题。 如何更改提交的作者姓名/电子邮件? 在我们进入解决方案之前,让我们找出您到底想要完成什么: 在提交之前更改作者信息在提交后更改作者信息(即历史提交…

修改git全局用户名,邮箱和密码

首先 打开idea的Terminal,输入命令查看当前git的全局用户名git config user.name 然后输入git config --global user.name "用户名" 然后输入第一个命令git config user.name,查看是否设置成功 到此修改成功。 邮箱查询:git confi…

chatgpt赋能python:Python自动化处理表格

Python自动化处理表格 随着大数据的时代来临,数据处理已经成为各种企业必备的基础工具。选择一个适合的工具可以极大提升工作效率和数据处理的水平。Python作为一种既实用又易用的编程语言,具有广泛的应用领域,包括数据处理。在这篇文章中&a…

ChatExcel--自动处理表格

文章目录 一、简介1.项目背景2.有点超越ChatGPT?3.功能特点4.ChatExcel入口5.操作系数 二、页面分析三、浅入测试1.模拟表格内容2.上传文件3.测试降序4.条件筛选 四、输入案例五、深入测试六、AI工具背景 一、简介 先行者–本文仅介绍ChatExcel基本用法和测试用例。…

腾讯、飞书等在线表格自动化编辑--python

编辑在线表格 一 目的二 实现效果三 实现过程简介1、本地操作表格之后进入导入在线文档2、直接操作在线文档 四 实现步骤讲解1、实现方法的选择2、导入类库3、设置浏览器代理直接操作已打开浏览器4、在线文档登录5、在线文档表格数据操作6、行数不够自动添加行数 五 代码实现小…

自动化电子表格处理

使用java来操作excel需要用到一个开源工具,Apache下的poi相关jar包。让我们可以很轻松的方便的操作excel文件。 首先,到官网把poi下载下来。官网地址 下载完成后,进行解压。把所有jar包导入到项目工程当中。 上面准备工作完成&#x…

提升10倍写作效率,这5个写作工具,文笔不好的人别错过

记得刚出来上班的时候,我的写作效率很低,经常没有思路,也找不到选题。甚至一两个小时过去了,仍然不知道如何动笔,经常写了删,删了又写。工欲善其事,必先利其器。在写作过程中,需要一…

黑马学生入职B站1年,晒出21K月薪:我想跳槽华为

前两天,黑马发布了《2022年度互联网平均薪资出炉!高到离谱!》,信息传输、软件和信息技术服务业薪资遥遥领先!Z时代举头望着天花板,故作潇洒:钱真的不重要。低头却想着搞钱大计:拖后腿…

黑马学生入职B站1年,晒出21K月薪:我想跳槽华为!

哈喽大家好,人见人爱,花见花开的播妞又来了!!! 现在的Z时代,嘴上说着不要,身体却很诚实。 前两天,黑马发布了《2022年度互联网平均薪资出炉!高到离谱!》&…

会玩!女网红化身AI,同时交往1000个男友,或年入4亿!

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年3月份热门报告合集 无需翻墙,ChatGPT直接使用 万字干货:ChatGPT的工作原理 2023年创业(有创业想法)必读手册 ChatGPT等…

chatgpt赋能python:python跨平台运行:让你的代码无限制

python跨平台运行:让你的代码无限制 Python语言一直以来都是一门跨平台的编程语言,这是开发者选择Python的一个很重要的原因。Python 正在迅速发展,而它作为一门跨平台的语言,最大程度减少了开发的难度和过程中的痛苦&#xff0c…

31w赛题奖金!当 AI for Science 撞上“先导杯”,会擦出什么样的火花?

进入 2022 年,AI for Science一连进入数个科技看点榜单。从《科学》、《自然》等顶尖学术杂志的年度技术突破,到百度、智源社区等发布的2022 科技趋势展望,AI for Science 正以席卷产学研各界之姿,进入人们的视野。 AI for Scienc…

人工智能机器深度学习与大数据技术在足球比赛预测推荐分析上的深度挖掘和应用

人工智能机器深度学习与大数据技术在足球比赛预测推荐分析上的深度挖掘和应用 足球作为世界第一大运动,也是最具影响力的体育项目。世界杯、欧洲杯,包括每年的五大联赛,成千上万的人成为它们的追逐者,因为热爱所以着迷。2009年&a…