最近的项目是一个智能摄像头的项目,对于我们Android客户端来讲,肯定核心的是就是音视频编解码了。对于硬件端,也就是摄像头端,在我接手项目的时候,他们都已经订好了技术方案。往客户端(iOS,Android,PC)三端传输的数据是音视频分开的。音频通过G711u,视频通过H264。我们客户端这边需要做的就是解码H264拿到未压缩的视频帧,和转码G711u到PCM可以播放 ***
视频解码,一开始由于项目紧张,人员也比较缺,这边没有懂视频的解码。所以当时就随便在网络上搜罗了一个H264的解码器(只有SO库),没想到的是竟然可以用。所以本着互联网思维(这里省略100个呵呵),我们就临时用了这个解码器,虽然效果不理想但是还算可以用。后来到了项目中期,我们开始自己学习写解码器。这里推荐三个搭建Android Stuido 搭建NDK开发环境的文章。
- 超级简单的Android Studio jni 实现(无需命令行)
- Android Studio使用gradle-experimental构建NDK工程(无需Android.mk、Application.mk文件)
- Android Studio NDk调试(基于gradle-experimental插件与LLDB)
下面是我的Gradle的配置,供大家参考
apply plugin: 'com.android.model.application' model { android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig.with { applicationId "liufei.person.ffmpegproject" minSdkVersion.apiLevel = 15 targetSdkVersion.apiLevel = 23 } } android.ndk { moduleName = "MyLibrary" ldLibs.addAll(['android', 'log']) } repositories { MyLibrary(PrebuiltLibraries) { ffmpeg { binaries.withType(SharedLibraryBinary) { sharedLibraryFile = file("src/main/jni/libffmpeg.so"); } } } } android.productFlavors { create("arm") { ndk.abiFilters.add("armeabi") } create("arm7") { ndk.abiFilters.add("armeabi-v7a") } // To include all cpu architectures, leaves abiFilters emptycreate("all") } android.sources { main { jni { exportedHeaders { srcDir "src/main/jni/include" } dependencies{ library "ffmpeg" } } } } android.buildTypes { release { minifyEnabled = false proguardFiles.add(file('proguard-rules.txt')) } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:cardview-v7:23.