抖音零播放(抖音播放量达到多少才有收益)

【点击查看】低成本上班族靠谱副业好项目 | 拼多多无货源创业7天起店爆单玩法
【点击查看】逆林创业记 | 拼多多电商店铺虚拟类项目新玩法(附完整词表&检测工具)
【点击查看】逆林创业记 | 小白ai写作一键生成爆文速成课
领300个信息差项目,见公众号【逆林创业记】(添加请备注:网站)
大家好久不见,又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章,这个系列的文章已经很久没有更新了,最后一篇文章是我开始开发 视频编辑SDK 时写的。当时踏入到了一个新的领域里,未知的东西太多了,导致接下来的大半年都没有更新相关的文章。 但是别以为我已经放弃了,今天对于我来说是一个值得纪念的日子,2019年10月28日 我终于将 视频编辑SDK 的最简版本给完成了,我将这个 视频编辑SDK 命名为 WSVideoEditor,接下来的一段时间里我计划更新 4 篇解析该 SDK 的相关文章,WsVideoEditor 中的代码我也会随着文章同步更新。当 SDK 解析完毕之后 从零开始仿写一个抖音App 系列文章将会踏出最关键的一步。
本文分为以下章节,读者可按需阅读:
一、项目介绍
本章我将介绍 WsVideoEditor 项目的基本结构、组织方式以及运行方式。需要大家把项目 clone 下来跟着我一步步来做。
1.基本结构
我们看着图1,一个个来讲:
2.buildtools:如图4,这个目录下主要存放一些工具脚本,例如目前 build_proto.sh 用于生成 Java 与 Cpp 层的 Protobuf 代码。3.ios、linux:因为我给 编辑SDK 的定义是一个跨平台的视频编辑SDK,所以未来的想法是 iOS 和 Linux 端也能接入我们的 编辑SDK,目前这两个目录里还啥也没有:-D。
4.sharedcpp:如图5,这个目录里面主要存放与平台无关的 Cpp 代码,因为我们要做的是一个跨平台的视频编辑 SDK,所以尽量多的将与平台无关的代码进行共用,是一个明智的选择。可以看见里面的 prebuilt_protobuf 目录下就有我们使用 build_proto.sh 生成的 Cpp 文件,这些文件就是可以共用的。5.sharedproto:这里存放着我们定义的 Protobuf 文件。6.thirdparty:这里存放着一些包含源码的与平台无关的三方库,例如 libyuv。7.CMakeLists.txt:这个文件主要是为了让 Clion 能够识别我们这个整个项目。2.如何运行项目二、SDK功能介绍
这一章我们来介绍一下 编辑SDK 目前有的以及未来会有的功能。编辑SDK 的最终形态会和抖音的视频编辑功能接近,有其他想法的读者也可以在评论区留言或者提 issue。
1.目前有的功能2.规划中的功能2.图片类:3.工具类:4.编码类:5.技术类:三、SDK架构以及运行机制介绍
这一章我来介绍一下目前 编辑SDK 的整体架构以及运行机制。
1.编辑SDK架构
图6是 编辑SDK 的架构图,这一节我会照着这张图来介绍。(1).基础API
先从底部看起,底部是整个 SDK 依赖的底层 API 库。
(2).SDK主体
接着我们再看图片中的主体部分,因为目前只有 Android 端的实现抖音零播放,所以主体部分的上层实现我使用 Android 来代替。
2.Native层架构:这里我们自底向上来剖析,Native 层的架构2.编辑SDK运行机制
上一节讲解了 编辑SDK 的架构,这一节在来基于图7讲讲 编辑SDK 的运行机制。2.再来看看图片左边抖音零播放,这是 WSMediaPlayer 的内部播放机制。要点为 三个循环,两个播放,我们还是自底向上解析。5.AudioPlayer:当视频处于 playing 状态时,它也会不断被 WSMediaPlayerView 通过定时循环驱动着从 AudioDecodeService 中取出当前的音频帧,然后通过反向代理将音频帧交给 Java 层的 AudioPlayer 进行播放。四、VideoDecodeService解析
上一章大概的讲了讲整个 编辑SDK 的整体架构和运行机制,但其实整个 编辑SDK 内部的每一个部分的细节都非常多,所以这一章我会先讲解 VideoDecodeService 的内部细节。其他各个部分则放在后面几篇文章中讲解。与此同时,WsVideoEditor 中的代码也会随着讲解的进行而不断更新。最终形成一个可用的 编辑SDK。
1.API讲解
-----代码块1----- VideoDecodeService.java
private native long newNative(int bufferCapacity);
private native void releaseNative(long nativeAddress);
private native void setProjectNative(long nativeAddress, double startTime, byte[] projectData);
private native void startNative(long nativeAddress);
private native String getRenderFrameNative(long nativeAddress, double renderTime);
private native void updateProjectNative(long nativeAddress, byte[] projectData);
private native void seekNative(long nativeAddress, double seekTime);
private native void stopNative(long nativeAddress);
private native boolean endedNative(long nativeAddress);
private native boolean stoppedNative(long nativeAddress);
private native int getBufferedFrameCountNative(long nativeAddress);
如代码块1所示,我们先来讲讲 VideoDecodeService 的 API
2.代码分析
这一小节中,我使用一个完整的例子来分析 VideoDecodeService 的源码
3.我们点击 START 按钮3.调用 start 最终也是到代码块3中,调用 Start 方法。我们继续进入 Start 方法中,发现其中是启动了一个线程然后调用 VideoDecodeService::DecodeThreadMain,这个方法内部则是一个 while 循环,每当使用 FFMPEG 解码出一个视频帧的时候就会将这一帧放到 decoded_unit_queue_ 中。当外部没有消费者时,decoded_unit_queue_ 的帧数量将会很快达到阈值(我们设置的是10),此时这个线程就会被阻塞。直到外部消费后,帧数量减少了,本线程将会继续开始解码视频帧,如此往复。
-----代码块3----- com_whensunset_wsvideoeditorsdk_inner_VideoDecoderService.cc
JNIEXPORT void JNICALL
Java_com_whensunset_wsvideoeditorsdk_inner_VideoDecodeService_setProjectNative
(JNIEnv *env, jobject, jlong address, jdouble render_pos, jbyteArray buffer) {
VideoDecodeService *native_decode_service = reinterpret_cast(address);
model::EditorProject project;
jbyte *buffer_elements = env->GetByteArrayElements(buffer, 0);
project.ParseFromArray(buffer_elements, env->GetArrayLength(buffer));
env->ReleaseByteArrayElements(buffer, buffer_elements, 0);
LoadProject(&project);
native_decode_service->SetProject(project, render_pos);
}
JNIEXPORT void JNICALL Java_com_whensunset_wsvideoeditorsdk_inner_VideoDecodeService_startNative
(JNIEnv *, jobject, jlong address) {
VideoDecodeService *native_decode_service = reinterpret_cast(address);
native_decode_service->Start();
}
五、尾巴
终于从零开发仿写一个抖音APP这一系列文章又重新开始更新了,今年以来文章的发表间隔长了很多,写文章的时间也少了很多。但是为了那么多支持、关注我的读者我也不能就这样放弃更新。立一个 flag,今后每个月都要更新一篇文章,希望大家能够多多支持,感谢!!
连载文章
不贩卖焦虑,也不标题党。分享一些这个世界上有意思的事情。题材包括且不限于:科幻、科学、科技、互联网、程序员、计算机编程。下面是我的微信公众号:世界上有意思的事,干货多多等你来看。
文章评论(0)