直播短视频源码开发一款短视频 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 需要具备哪些知识?_直播源码

短视频 SDK 项目有更新都会提交到此处 AVEditor (ps:目前只是一个半成品,功能尚未开发完成)

直播短视频源码开发一款短视频 SDK 需要具备哪些知识?本文转载自网络,感谢(DevYK)的分享,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理