游戏开发需要具备哪些技术_短视频 SDK 开发 (一) 开发一款短视频 SDK 需要具备哪些知识?...
2020 年要屬什么最火,肯定是短視頻和直播帶貨了。我自己基本上每天晚上睡覺之前都會刷一會兒 douyin 短視頻,不得不承認 douyin 的推薦算法是真 nb ,推薦的都是我的最愛 ??。那么 douyin 短視頻這么 nb 我們可不可以自己模仿著也做一個? 想想都覺得難啊,但是還是可以模仿著做一個的。我們先來看一下效果,這只是第一個版本,具備的功能有限。后面會一直持續迭代下去!
那么,作為一個音視頻零基礎的人來說, 開發一款短視頻 SDK 到底需要具備哪些知識呢? 下面就由我為大家介紹一翻(ps:以下學習路徑僅代表個人觀點)。
?接下來的日子我準備從 0-1 寫一個如何開發一款音視頻編輯的 SDK 系列文章,下面是我的計劃。
短視頻 SDK 開發 (一) 開發一款短視頻 SDK 需要具備哪些知識?
短視頻 SDK 開發 (二) 短視頻 SDK 架構設計
短視頻 SDK 開發 (三) FFmpeg + OpenGL ES + OpenSL ES + soundtouch 實現音視頻播放器
短視頻 SDK 開發 (四) Camera + MediaCodec + OpenGL ES + OpenSL ES + FFmpeg MP4Muxer 實現音視頻實時錄制封裝為 MP4
短視頻 SDK 開發 (五) 濾鏡、貼紙、水印實現
短視頻 SDK 開發 (六) 美顏特效實現
短視頻 SDK 開發 (七) 音視頻剪輯實現
?基礎知識
1、你必須要有?「C/C++」?開發語言基礎,可以看我之前寫的文章
- 音視頻學習 (一) C 語言入門
- 音視頻學習 (二) C++ 語言入門
2、接下來就需要掌握?「JNI」?基礎了
- 音視頻學習 (三) JNI 從入門到掌握
3、有了?「C/C++/JNI」?基礎,你還要學會如何交叉編譯?「FFmpeg」?等 C/C++ 庫
- 音視頻學習 (四) 交叉編譯動態庫、靜態庫的入門學習
- 音視頻學習 (五) Shell 腳本入門
- 音視頻學習 (六) FFmpeg 4.2.2 交叉編譯
4、有了以上的基礎,那么就可以開始了解 音視頻 的基礎知識了
- 雷神-視音頻編解碼技術零基礎學習方法 
- 雷神-視音頻數據處理入門:RGB、YUV像素數據處理 
- 雷神-視音頻數據處理入門:PCM音頻采樣數據處理 
- 雷神-視音頻數據處理入門:H.264視頻碼流解析 
- 雷神-視音頻數據處理入門:AAC音頻碼流解析 
- 音視頻學習 (七) 掌握音頻基礎知識并使用 AudioTrack、OpenSL ES 渲染 PCM 數據 
- 音視頻學習 (八) 掌握視頻基礎知識并使用 OpenGL ES 2.0 渲染 YUV 數據 
5、現在可以入手音視頻 AAC 、H264 軟硬編解碼了
| fdkaac_audio_encode_decode | Libfdk-aac 音頻編解碼 | 
| x264_video_encode | Libx264 視頻編碼 | 
| mediacodec_audio_encode_decode | Android MediaCodec AAC 硬編解碼 | 
| mediacodec_video_encode_decode | Android MediaCodec H264 硬編解碼 | 
| ffmpeg_audio_encode_decode | FFmpeg API 實現音頻 AAC 軟編解碼 | 
| ffmpeg_video_encode_decode | FFmpeg API 實現視頻 H264 軟編解碼 | 
| lame_ffmpeg_mp3_encode_decode | MP3 編解碼 | 
| JavaAVPlayer | Java API 實現音視頻播放(mp3/mp4/pcm/yuv) | 
| NativeAVPlayer | Native 端實現音視頻播放(PCM/YUV) | 
| ffmpeg_muxer | 基于 h264,AAC 文件打包為 MP4 | 
基礎知識差不多就這些了,如果有落下的后面再補上
中級知識
1、FFmpeg + OpenGL ES + OpenSL ES + soundtouch 完成音視頻播放
- Google 官方的音視頻播放庫 -grafika
- bilibili 官方開源的音視頻播放庫- ijkplayer
- 當然也可以參考我自己的 AVEditor 音視頻播放模塊
2、OpenGL ES 渲染視頻是必須要會的
- NDK_OpenGLES_3_0
3、Camera + MediaCodec + OpenGL ES + OpenSL ES + FFmpeg MP4Muxer 實現音視頻錄制為 MP4 格式
- camera_recorder
4、RTMP 推流實現
- AVRtmpPushSDK
高級知識
1、音視頻變速、變調錄制
- 音頻-soundtouch
- 視頻修改時間戳即可達到變速錄制
2、音視頻錄制實時濾鏡實現
- android-gpuimage
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?JNICALLJava_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?????????sA[i]?=?(short)?((sourceA[i?*?2]?&?0xff)?|?(sourceA[i?*?2?+?1]?&?0xff)?<8);
????}
????short?sB[row];
????for?(int?i?=?0;?i?????????sB[i]?=?(short)?((sourceB[i?*?2]?&?0xff)?|?(sourceB[i?*?2?+?1]?&?0xff)?<8);
????}
????short?result[row];
????for?(int?i?=?0;?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?????????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 來說, 要學這門知識基本上肯定是要按 月 為單位來計算。當然不要看著學習成本高,就直接放棄了,一般來說高投入肯定會有高回報的。好了,短視頻入門開發就介紹到這里了。下面推薦一個目前我自己開源的零基礎音視頻進階路線項目, 有需要的可以關注 star 一波 AVSample
貼一張進階路線圖
短視頻 SDK 項目有更新都會提交到此處 AVEditor (ps:目前只是一個半成品,功能尚未開發完成)
總結
以上是生活随笔為你收集整理的游戏开发需要具备哪些技术_短视频 SDK 开发 (一) 开发一款短视频 SDK 需要具备哪些知识?...的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 京东金条怎么协商还款,有以下两步
- 下一篇: 一加 Ace 2“冰河蓝”配色真机图曝光
