android sdl2 音频,SDL 2的Android启动流程与音频播放前的处理

最近在移植一个音频特效功能,因项目老代码使用SDL 2.0实现了简单的视频播放器。新增功能是根据音频变化改变视频渲染结果,音频处理算法由Java实现,为了快速验证效果,故在Java中进行音频相关计算。

SDL 2.0的启动流程

以继承SDLActivity为例。

1、实现SurfaceView回调

onCreate(Bundle savedInstanceState)

|- addVideoView();

|- mSurface = new SDLSurface(getApplication());

|- getHolder().addCallback(this);

2、在回调中继续执行初始化

surfaceChanged(SurfaceHolder holder, int format, int width, int height)

|- SDLActivity.playMovieVideo();

|- SDLActivity.mSingleton.OnPlayMovieVideo();

|- SDLActivity.mSingleton.OnPlayMovieVideo(); // 子类覆盖

|- super.startPlayThread()

|- startSDLThread();

|- SDLActivity.mSDLThread = new Thread(new SDLMain(ffmpegString), "SDLThread");

|- SDLActivity.mSDLThread.start();

|- SDLActivity.nativeInit(); // 开始JNI调用

JNI——————————————————————————

[SDL_android_main.c]void Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv *, jclass, jobject)

|- [SDL_android.c]void SDL_Android_Init(JNIEnv *, jclass)

|- [SDL_android.c]int Android_JNI_SetupThread()

|- [SDL_android.c]JNIEnv *Android_JNI_GetEnv()

|- pthread_setspecific(mThreadKey, (void*) env); // 保存env到SDL线程,方便后续调用Java方法

|- SDL_SetMainReady();

// 预编译后实际方法名为void SDL_SetMainReady_REAL(),对于Android,具体实现为SDL.c文件的void SDL_SetMainReady(void)

|- int SDL_main(int, char **)

// 具体实现为main.cpp文件的int main(int argc, char *argv[]),在此启动SDL消息处理线程开始不断的SDL_PollEvent(&event),类似Win32开发中的WndProc。

音频播放前的处理

为了在音频播放前进行声音的计算,可在SDL 2.0传递数据到AudioTrack前处理。

从SDL的C代码上看,最后会调用SDLActivity类中的方法,比如音频初始化public static int audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames),所以Java相关的处理可放在此函数中进行。

当配置成16位整数PCM时,最终调用public static void audioWriteShortBuffer(short[] buffer),故对PCM数据的计算可在此进行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值