首页
学习
活动
专区
圈层
工具
发布

从零开始仿写一个抖音App——视频编辑SDK开发(二)

本文分为以下章节,读者可按需阅读: 1.OpenGL之我的理解 2.Android层的框架搭建 3.C/C++渲染视频帧 4.尾巴 一、OpenGL之我的理解 讲解 OpenGL 的教程目前有很多,所以这一章笔者不会去教大家如何入门或者使用...1.首先我们可以在 Java/c/c++ 等等语言中使用 OpenGL 的 api,所以这里我使用 c 来讲解。 2.如图我们可以看见:GPU 内部会包括显存和GPU核心。...上的 Java 语言下的 OpenGL 教程: OpenGLES3.0 接入视频实现特效 二、Android层的框架搭建 我的老本行是 Android 开发,所以这一章我会讲解视频编辑SDK在 Android...三、C/C++渲染视频帧 我在从零开始仿写一个抖音App——视频编辑SDK开发(一) 的第四章VideoDecodeService解析中讲解了如何解码出视频帧,在上一章中讲解了如何在 Android...这个方法目前还不完善里面只有测试代码,因为我们目前只能播放图像,还没有播放声音,所以目前 current_time_ = current_time = GetRenderPos() 获取到的时间戳,是我构造的测试代码

2K30

Android FFmpeg系列02--音视频基础

Android平台,碎片化严重,MediaCodec的坑也是不少 视频帧率 视频一秒显示的帧数 音频采样率 即取样频率,指录音设备在单位时间内对模拟信号采样的多少采样率越高,声音的质量越好,还原越真实...DTS(Decoding Time Stamp):解码时间戳,告知解码器在什么时间点解码这一帧的数据 PTS(Presentation Time Stamp):显示时间戳,告知播放器什么时间点显示这一帧数据...time_base是时间戳的单位,时间戳乘以时间基可以得到实际的时间值(以秒为单位),我们可以把time_base看作一个时钟脉冲,dts/pts等看作时钟脉冲的计数 例如某一个视频帧dts是40,pts...Android FFmpeg系列01--编译与集成 2. Ne10的编译与使用 3. 如何使用OpenGL渲染YUV数据 4. Android中如何使用OpenGL播放视频 5....如何使用MediaCodec解码音视频

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MediaMuxer录制视频踩坑记录

    基本知识MediaCodec的相关数据时间单位为(纳秒/1000),类似610,729,613,772, 倒数第7位代表秒级MediaMuxer.writeSampleData Failed描述:写入数据失败常见原因这类错误基本和时间戳有关时间戳倒退问题现象解决吐出时间戳倒退丢弃异常帧...(经测试无影响,且量级不大)吐出时间戳相等丢弃异常帧(有些机器能接受相等的数据,为了通用性还是丢弃)此类问题出现一般在异常后的一帧写入报错分析问题需要区分音频视频各自的时间戳查看示例第二行ts小于第一行的...解决方案使用队列保存原始数据,一般使用HandlerThread的Looper机制保存消息在同一个线程做input,output,每一次input等到output完成再进行下一次input,保证每一帧数据消费完音视频录制后卡顿这类问题一般两种情况...,时间戳不对,部分数据帧被都丢弃MediaMuxer.Start时机不对解决方案建议时机:dequeueOutputBuffer返回MediaCodec.INFO_OUTPUT_FORMAT_CHANGED...start,在触发addTrack会爆addTrack ERROR如果提前addTrack && start,录制视频会卡顿兼容性问题导致数据被丢弃问题现象有些机型,音频 or 视频初始化很慢,时间错开

    4.4K30

    【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】六、FFmpeg简单合成MP4:视屏解封与重新封装

    当然了,在了解如何编码之前,先了解如何对编码好的音视频进行封装,会有事半功倍的效果。 在《音视频解封和封装:生成一个MP4》中使用了 Android 的原生功能,实现了对音视频的重打包。...,获取原视频参数 代码很简单,在使用 FFMpeg 解码的文章中就已经讲解过。...FFmpeg 中的时间单位 我们知道,每一帧音视频数据都有其对应的时间戳,根据这个时间戳就可以实现对音视频播放的控制。 FFmpeg 中的时间戳并不是我们实际中的时间,它是一个特别的数值。...而 FFmpeg 在不同的阶段和不同的封装格式下也有着不同的时间基,因此,在进行帧数据的封装时,需要根据各自的时间基进行 “时间戳” 转换,以保证最终计算得到的实际时间是一致的。...即: x(目标时间戳值) * cq(目标时间基)= a(原时间戳值) * bq(原时间基) =》=》=》=》=》=》 x = a * bq / cq 当所有数据帧都读取完毕之后,需要通过 av_write_trailer

    1.2K20

    干货分享之如何设计实现跨平台超低延迟RTSP播放器

    去分片/聚合与切帧 H.264/H.265 支持 FU 分片重组(S/E 标识)与 STAP/AP 聚合拆分; 以 (SSRC, RTP 时间戳) 聚合为“接入单元”(Access Unit),时间戳变化...3.2 视频格式 H.264 / H.265(HEVC) RTP 去封装:支持 FU 分片重组、STAP/AP 聚合拆分; 时钟与切帧:90kHz 时基,同一帧时间戳相同;以 时间戳变化 / M 位...音频做细微节奏调整(残差桶/微抻缩),避免长时间漂移; 首开门控:拿到 IDR + 参数集 再出首帧,减少花屏; 队列治理:视频 1–2 帧、音频 80–120ms;超过水位触发背压(只播关键帧 /...5.3 Jitter Buffer:小滑窗吸收乱序 设计:以 (SSRC, RTP 时间戳) 为键的短滑窗重排;视频窗口 1–2 帧,音频窗口 ≤120 ms。...A/V 同步:以视频为主时钟,音频做微调(残差桶法),禁止时间戳回拨。 5.5 “只播关键帧”兜底(Windows 可选) 触发场景:弱网、NVR 拉满路数、或“监看优先可视性”场景。

    70410

    端–边–云一体的实时音视频转发:多路RTSP转RTMP推送技术深度剖析

    单调性:所有上行消息时间戳 单调不回拨;音视频各自单调且 A/V 差稳定在可接受范围。...数据帧:裸 AAC 帧(不带 ADTS 头)。 时间戳:音频 DTS=PTS,按帧步进累计到 RTMP 毫秒时基。 静音门控:静音仅关闭负载,时间线照常推进,避免恢复时“回拨”。...静音:实时静音仅关闭负载门,时间线照常推进(发“空帧”或直接不发,但恢复时戳不可回退);恢复后继续单调递增。 4) A/V 同步与漂移修正 主从策略:以 视频为主时钟,音频做微调。...做法:rtmp_ms = rtp_ts / 90(Video);AAC 按帧步进累加;禁止时间戳回拨;CompositionTime(CT)控制在 0–250 ms(如无 B 帧),有 B 帧时仅在同一...时间戳单调吗?

    77610

    融云技术分享:基于WebRTC的实时音视频首帧显示时间优化实践

    1、引言 在一个典型的IM应用里,使用实时音视频聊天功能时,视频首帧的显示,是一项很重要的用户体验指标。...在实践当中发现,发送端发送的视频宽高需要 16 字节对齐,因为在某些 Android 手机上解码器需要 16 字节对齐。...从而会触发观看端的关键帧请求给服务器。 这里要求服务器必须转发接收端发来的关键帧请求给发送端。若服务器没有转发关键帧给发送端,接收端就会长时间没有可以渲染的图像,从而出现黑屏问题。...如果因此持续丢弃 packet,就会有视频不显示或卡顿的情况。 举例2: 正常情况下 FrameBuffer 中帧的 picture id,时间戳都是一直正增长的。...如果 FrameBuffer 收到 picture_id 比最后解码帧的 picture id 小时,分两种情况: 1)时间戳比最后解码帧的时间戳大,且是关键帧,就会保存下来。

    1.6K00

    FFMPEG Tips (3) 如何读取

    [1 ]  音频帧还是视频帧 -> 分别送入音频/视频××× [2 ]  关键帧还是非关键帧 -> 追帧优化 [3 ]  帧的数据和大小 -> 取出帧的内容 [4 ]  时间戳信息 -> 音视频同步 3...3.1 如何判断是音频帧还是视频帧 上一篇文章我们提到过,使用下面的方法,获取码流中的 video_stream_idx 和 audio_stream_idx int video_stream_idx ...帧的数据和大小直接定义在 AVPacket 结构体中,对应的成员变量如下: // 压缩编码的数据,一帧音频/视频 uint8_t *data; // 数据的大小 int size; 3.4 如何获取帧的时间戳信息...每一个帧都可能携带有 2 个时间戳信息,一个是解码时间戳 dts,一个是显示时间戳 pts,解码时间戳告诉我们什么时候需要解码,显示时间戳告诉我们什么时候需要显示,只有在码流中存在 B 帧的情况下,这两个时间戳才会不一致... {         LOGD("read audio frame, timestamp = %lld \n”, avpkt.pts);     } } 由此,我们就可以通过这些 log 信息调试一下某一段音视频流的时间戳是否正确

    1.6K10

    Android FFmpeg 实现带滤镜的微信小视频录制功能

    [Android FFmpeg 实现带滤镜的微信小视频录制功能] 上一集,有读者吐槽这个系列更新太慢了,其实实现代码一直都有,只能每天花一点时间整理一些,慢慢整理出来。...音视频录制编码流程 [音视频编码流程图] 本文采用的是软件编码(CPU)实现,所以针对高分辨率的预览帧时,就需要考虑 CPU 能不能吃得消,在骁龙 8250 上使用软件编码分辨率超过 1080P 的图像就会导致...音视频录制代码实现 Java 层视频帧来自 Android Camera2 API 回调接口。...); } else { LOGCATE("MediaRecorder::StartVideoEncodeThread start usleep"); //视频时间戳大于音频时间戳时...[带滤镜的小视频录制] 参考上图,我们在 GL 线程里首先创建 FBO ,先将预览帧渲染到 FBO 绑定的纹理上添加滤镜,之后使用 glreadpixels 读取添加完滤镜之后的视频帧放入编码线程编码,

    1.9K60

    如何设计开发RTSP直播播放器?

    这涉及到处理视频和音频的时间戳、帧率、采样率等参数,以及进行适当的同步调整。视频和音频的同步是一个复杂的问题,需要考虑多种因素,如网络延迟、解码时间、播放设备的性能等。...例如,在 Android 平台上,可能需要使用 Java 或 Kotlin 进行开发,并利用 Android 的多媒体框架;在 iOS 平台上,可能需要使用 Objective-C 或 Swift 进行开发...例如,在 Android平台上可以使用 Java 或 Kotlin 进行开发,利用 Android SDK 提供的多媒体框架和网络功能来实现 RTSP 播放器。...可以使用缓冲区来存储接收到的数据,以便后续的解码和播放操作。视频解码和播放选择合适的视频解码器对接收的媒体流数据进行解码,并将解码后的视频帧显示在屏幕上。...音视频同步处理:有些播放器为了追求低延迟,甚至不做音视频同步,拿到audio video直接播放,导致a/v不同步,还有就是时间戳乱跳等各种问题,大牛直播SDK提供的播放器,具备好的时间戳同步和异常时间戳矫正机制

    1.7K10

    融云 WebRTC 首帧显示优化策略到底有多强?

    融云 WebRTC 高级工程师 苏道 音视频实时通话首帧的显示是一项重要的用户体验标准。本文主要通过对接收端的分析来了解和优化视频首帧的显示时间。...在实践当中发现,发送端发送的视频宽高需要 16 字节对齐。因为在某些 Android 手机上解码器需要 16 字节对齐。...从而会触发观看端的关键帧请求给服务器。这里要求服务器必须转发接收端发来的关键帧请求给发送端。若服务器没有转发关键帧给发送端,接收端就会长时间没有可以渲染的图像,从而出现黑屏问题。...如果因此持续丢弃 packet,就会有视频不显示或卡顿的情况。 举例2 正常情况下 FrameBuffer 中帧的 picture id,时间戳都是一直正增长的。...如果 FrameBuffer 收到 picture_id 比最后解码帧的 picture id 小时,分两种情况: 1. 时间戳比最后解码帧的时间戳大,且是关键帧,就会保存下来; 2.

    1.8K61

    Android音视频开发:基于 Camera2 API 实现RTMP推流、RTSP服务与录像一体化方案

    真正的挑战在于:如何在资源受限的 Android 设备上,构建一个既能“对外”进行 RTMP 直播、又能“对内”提供低延迟 RTSP 分发,同时还能完成“本地”高保真录像的『全功能媒体节点』?...本文将深入源码,结合 MainActivity.java 及核心辅助类,剖析如何利用 Android Camera2 API 的高效采集能力,配合 大牛直播SDK (SmartPublisher) 的多路分发架构...整体数据流向如下: 数据采集:Camera2Helper 负责调用 Camera2 API,通过 ImageReader 获取 YUV_420_888 格式的视频帧。...数据前处理:LayerPostThread 负责处理视频层叠加(如时间戳、文字水印、图片Logo)。...动态时间戳:通过 makeTimestampString() 生成当前时间 Bitmap。 文字/图片水印:支持添加 Logo 或文字。 矩形框绘制:演示了动态绘制 RGB 图层。

    42600

    用于浏览器中视频渲染的时间管理 API

    、确定性的渲染;2)通过各种技术优化性能;3)如何测试基于时间的状态(或者,如何在测试中进行时间的移动);4)如何将各种类型的媒体(视频、字幕等)与单一事实来源同步。...因此我们不仅需要将场景的持续时间存储在状态中,还要将活动的场景存在其中。当用户按下播放时,我们需要计算活动场景是什么,哪些元素应该出现在画布上。...由于 API 的设置问题,任何使用此链接的组件都会接受当前时间值。但是当前时间值每帧都会更改,这样导致几乎画布上的所有组件每一帧都会被重新渲染。...然后用 usePlayback 启用播放,将时间提前 50ms ,并通过 Jest 移动 50ms 来触发一帧,这将触发之前设置的超时调用,这就提供了一种逐帧推进时间的方法,以便我们可以更加精细地进行测试...动画:可以利用构建的时间系统来创建基于插值的动画,对于给定的时间戳或者给定的帧,输出特定的 CSS 值。

    3.1K10

    SmartMediaKit 在检测机器人中的视频链路重构:从播放(RTSP)到二次水印编码再推流(RTSP|RTMP)

    二、技术核心:Android端 RTSP 播放器 + YUV 回调链在现代检测机器人中,视频链路的核心不只是“播放画面”, 而是如何在多任务环境下实现实时解码、帧级操作与数据再利用。...在终端侧(Android 控制端),SmartPlayer 组件基于大牛直播SDK 的 RTSP 播放模块进行接入、解码,并在解码后回调出原始的 YUV 帧数据:在这一回调中,每一帧都携带完整时间戳(ptsMs...,再可选开启 RTSP/RTMP 再发布; 4️⃣ 整个过程共享同一时间戳体系,录像、推流与播放保持帧级同步。...每一帧视频在解码完成后,会通过 JNI 层回调出 原始 YUV 数据 与对应时间戳:这一机制让上层应用获得对视频帧的“直接访问权”,不再局限于播放器内部渲染,从而为后续的业务加工、录像与再发布提供可能。...在投递之前,可插入定制化的业务逻辑,例如: 在 Y 平面直接绘制时间戳或企业 Logo; 叠加检测编号或现场参数; 对画面区域进行简单遮罩或标注。

    30310

    Android平台下使用FFmpeg进行RTMP推流(视频文件推流)简介

    简介 前面已经讲到如何在Linux环境下编译FFmpeg以及在Android项目中使用,这一节就开始真正的使用FFmpeg。在Android平台下用FFmepg解析视频文件并进行RTMP推流。...如果对FFmpeg基础不熟或者不知道如何在Android项目中使用,请先阅读流媒体专栏里之前的文章。 注意:这里的工程沿用Linux下FFmpeg编译以及Android平台下使用里的工程和结构。...至于FFmpeg的使用,这里就不重复讲了,不懂的可以看之前的文章。源码见末尾 异常处理 在我们之前的推流代码中,并没有做异常处理。这样在正式的使用中肯定不太好的。所以我们加上try catch。...; //推流每一帧数据 //int64_t pts [ pts*(num/den) 第几秒显示] //int64_t dts 解码时间 [P帧(相对于上一帧的变化...//获取当前的时间戳 微妙 long long start_time = av_gettime(); long long frame_index = 0;

    7.9K20

    Android流媒体开发之路三:基于NDK开发Android平台RTSP播放器

    我这边做,核心模块和核心代码部分,都是基于NDK,用C++开发的,然后将so动态库,在Android java环境中使用,这个既能保证核心部分的代码性能,也能最大程度复用之前写的流媒体相关的大量代码,实践证明...解码后需要对数据进行缓冲,按照时间戳进行排队。这个不管是直播还是点播,都需要做队列,否则同样会出现卡顿、音视频不同步,以及其他的情况,这个是非常重要的一点。...,为了音频和视频的同步,必须注意音频和视频各自的时间戳,需要按照真实的时间进行还原。...而当发现视频和音频不同步的时候,或者因为缓冲问题,导致视频需要丢包的情况下,需要及时调整音频播放队列的基准时间戳,避免音视频不同步的情况出现。同时,这样做也能避免长期累积造成的计算误差。...同时在抛弃数据的时候,要考虑到关键帧的问题,也就是如果发生了抛帧,那么整个GOP的数据都应当放弃,除非是有冗余编码等编码技术,以此来避免花屏的情况,以及第2点列出的音视频同步问题。

    3.2K20

    Android FFmpeg 实现带滤镜的微信小视频录制功能

    音视频编码流程图 本文采用的是软件编码(CPU)实现,所以针对高分辨率的预览帧时,就需要考虑 CPU 能不能吃得消,在骁龙 8250 上使用软件编码分辨率超过 1080P 的图像就会导致 CPU 比较吃力...音视频录制代码实现 Java 层视频帧来自 Android Camera2 API 回调接口。...JNI 实现主要是,在开始录制时传入输出文件路径、视频码率、帧率、视频宽高等参数,然后不断将音频帧和视频帧传入 Native 层的编码队列中,供编码器编码。...} else { LOGCATE("MediaRecorder::StartVideoEncodeThread start usleep"); //视频时间戳大于音频时间戳时...带滤镜的小视频录制 参考上图,我们在 GL 线程里首先创建 FBO ,先将预览帧渲染到 FBO 绑定的纹理上添加滤镜,之后使用 glreadpixels 读取添加完滤镜之后的视频帧放入编码线程编码,最后绑定到

    1.1K30

    【Android 音视频开发打怪升级:音视频硬解码篇】三、音视频播放:音视频同步

    = -1 /**当前帧时间戳*/ private var mCurSampleTime: Long = 0 /**开始解码时间点*/ private...4)进入下一帧:先记录当前帧的时间戳,然后调用advance进入下一帧,这时读取指针将自动移动到下一帧开头。 //记录当前帧的时间戳 mCurSampleTime = mExtractor!!....这样可以用来实现同步的时间源就有三个: 视频时间戳 音频时间戳 外部时间戳 视频PTS 通常情况下,由于人类对声音比较敏感,并且视频解码的PTS通常不是连续,而音频的PTS是比较连续的,如果以视频为同步信号源的话...但是这里不采用,而是使用系统时间作为同步信号源。因为如果以音频PTS作为同步源的话,需要比较复杂的同步机制,音频和视频两者之间也有比较多的耦合。...比对 在解码数据出来以后,检查PTS时间戳和当前系统流过的时间差距,快则延时,慢则直接播放 2.

    2.9K20

    Android原生编解码接口 MediaCodec 之——踩坑

    手动触发输出关键帧。...自动触发输出关键帧 在MediaCodec硬编码中设置I(关键帧)时间间隔,在 api 中是这么设置的 mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL..., 1); //关键帧间隔时间 单位s 自动触发实际是按照帧数触发的,例如设置帧率为 20 fps,关键帧间隔为 1s ,那就会每 20桢输出一个关键帧,一旦实际帧率低于配置帧率,那就会导致关键帧间隔时间变长...有时候你会发现自动触发关键帧方式失效了 经排查发现真正的原因是在于视频的输入源,如果是通过Camera的PreviewCallback的方式来获取视频数据再喂给MediaCodec的方式是无法控制输出关键帧的数量的...,大多数java 使用毫秒和纳秒,单位要处理好 如果采用surface输入,想要丢帧要如何操作 ??

    7.6K20
    领券