直播短视频源码开发一款短视频 SDK 需要具备哪些知识?
1、音视频变速、变调录制
-
视频修改时间戳即可达到变速录制
2、音视频录制实时滤镜实现
3、分段录制、水印、背景音
「分段录制:」 每次录制完成将录制的路径保存下来,最后将这些 MP4 的文件合并为一个 MP4 文件
「水印:」 拿着上一个视频处理的 纹理 ID ,在这基础上渲染一个 BItmap 即可
「背景音混音:」 可以参考如下实现代码
/**
* 参考地址:https://www.shangmayuan.com/a/6daeefedbecb463f9dfce318.html
* 归一算法:http://www.cppblog.com/jinq0123/archive/2007/10/31/35615.aspx
* 能量值实现:https://www.jianshu.com/p/d3745dd23056
* 实现原理:
* 其实音频混音的核心原理就是将两个音频的原始byte数据进行叠加,
* 很是简单的 + 起来,好比某个位置的数据是 1 而另外一个音频一样位置是 2 加起来就是3,
* 这样就完成了音频的混音,固然这是最基础也是最垃圾的混音算法,咱们这里会介绍其中的一种混音算法,
* 基本上能够达到商业使用的。那就是归一化混音算法。
*
* C = A + B - A * B / (数据类型的最大值);
* byte数据就是
* C = A + B - A * B / 127;
* short数据就是
* C = A + B - A * B / 32767;
* //vol的取值范围 一般是小于10,大于0的,若是是0的话,就没有声音了,若是太大了就会出现杂音
* C = A * vol;
*
*
* 混音算法总结:
* 总结一下我对混音算法的学习,大概有以下几种方式:
* 1. 直接加和
* 2. 加和后再除以混音通道数,防止溢出
* 3. 加和并箝位,如有溢出就设最大值
* 4. 饱和处理,接近最大值时进行扭曲(“软件混音的实现”一文算法就是这类)
* 5. 归一化处理,全部乘个系数,使幅值归一化。(只适用于文件)
* 6. 衰减因子法,用衰减因子限制幅值[1]。
*/
extern "C"
JNIEXPORT jbyteArray JNICALL
Java_org_doubango_ngn_media_mixer_MultiAudioMixer_audioMix2(JNIEnv *env, jobject instance,
jbyteArray sourceA_,
jbyteArray sourceB_,
jbyteArray dst_, jfloat firstVol,
jfloat secondVol) {
jbyte *sourceA = env->GetByteArrayElements(sourceA_, NULL);
jbyte *sourceB = env->GetByteArrayElements(sourceB_, NULL);
jbyte *dst = env->GetByteArrayElements(dst_, NULL);
//归一化混音
int aL = env->GetArrayLength(sourceA_);
int bL = env->GetArrayLength(sourceB_);
//除以通道数量
int row = aL / 2;
short sA[row];
for (int i = 0; i < row; ++i) {
sA[i] = (short) ((sourceA[i * 2] & 0xff) | (sourceA[i * 2 + 1] & 0xff) << 8);
}
short sB[row];
for (int i = 0; i < row; ++i) {
sB[i] = (short) ((sourceB[i * 2] & 0xff) | (sourceB[i * 2 + 1] & 0xff) << 8);
}
short result[row];
for (int i = 0; i < row; ++i) {
int a = (int) (sA[i] * firstVol);
int b = (int) (sB[i] * secondVol);
if (a < 0 && b < 0) {
int i1 = a + b - a * b / (-32768);
if (i1 > 32768) {
result[i] = 32767;
} else if (i1 < -32768) {
result[i] = -32768;
} else {
result[i] = (short) i1;
}
} else if (a > 0 && b > 0) {
int i1 = a + b - a * b / 32767;
if (i1 > 32767) {
result[i] = 32767;
} else if (i1 < -32768) {
result[i] = -32768;
} else {
result[i] = (short) i1;
}
} else {
int i1 = a + b;
if (i1 > 32767) {
result[i] = 32767;
} else if (i1 < -32768) {
result[i] = -32768;
} else {
result[i] = (short) i1;
}
}
}
for (int i = 0; i < row; ++i) {
dst[i * 2 + 1] = (jbyte) ((result[i] & 0xFF00) >> 8);
dst[i * 2] = (jbyte) (result[i] & 0x00FF);
}
jbyteArray result1 = env->NewByteArray(aL);
env->SetByteArrayRegion(result1, 0, aL, dst);
env->ReleaseByteArrayElements(sourceA_, sourceA, 0);
env->ReleaseByteArrayElements(sourceB_, sourceB, 0);
env->ReleaseByteArrayElements(dst_, dst, 0);
return result1;
}
复制代码
5、人脸识别-特效
-
可以使用 OpenCV 来做人脸识别,拿到人脸特征点位,最后利用这些点位用 OpenGL 绘制绘制出来就行了。
6、音视频剪辑技术
=
总结
目前能想到的从 0-1 开发一款短视频 SDK 需要具备的知识大概就是这些。其实学习这些知识相对而言时间成本都比较高,因为每一个知识点基本上都是一个独立的,就拿 OpenGL 来说, 要学这门知识基本上肯定是要按 月 为单位来计算。当然不要看着学习成本高,就直接放弃了,一般来说高投入肯定会有高回报的。好了,短视频入门开发就介绍到这里了。
短视频 SDK 项目有更新都会提交到此处 AVEditor (ps:目前只是一个半成品,功能尚未开发完成
)
直播短视频源码开发一款短视频 SDK 需要具备哪些知识?本文转载自网络,感谢(DevYK)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理