想弄个小东西,自己练习一下,就想到把FFmpeg移植到android上面
网上有现成的2.2的移植,可以下载下来,链接https://github.com/havlenapetr,里面的ffmpeg和framework下面的libaudio和libviedo两个so,就是全部的东西。
看过一些东西,都说不开放某些代码,挺没劲的,人家都已经放出全部代码了,有什么藏匿的。
app下面的代码几乎不需要修改,就是一些编译的错误,就是framework下面的本地适配需要需要改一下,适应一下ics,就是surface.cpp这个文件。
- /*
- *Copyright(C)2009TheAndroidOpenSourceProject
- *
- *LicensedundertheApacheLicense,Version2.0(the"License");
- *youmaynotusethisfileexceptincompliancewiththeLicense.
- *YoumayobtainacopyoftheLicenseat
- *
- *http://www.apache.org/licenses/LICENSE-2.0
- *
- *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
- *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
- *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
- *SeetheLicenseforthespecificlanguagegoverningpermissionsand
- *limitationsundertheLicense.
- */
- #include<android/surface.h>
- #include<surfaceflinger/Surface.h>
- #include<utils/Log.h>
- #include<SkBitmap.h>
- #include<SkCanvas.h>
- #defineTAG"SurfaceWrapper"
- usingnamespaceandroid;
- staticSurface*sSurface;
- staticSkBitmapsBitmapClient;
- staticSkBitmapsBitmapSurface;
- staticSurface*getNativeSurface(JNIEnv*env,jobjectjsurface)
- {
- jclassclazz=env->FindClass("android/view/Surface");
- jfieldIDfield_surface=env->GetFieldID(clazz,"mNativeSurface","I");
- if(field_surface==NULL)
- {
- returnNULL;
- }
- return(Surface*)env->GetIntField(jsurface,field_surface);
- }
- staticintinitBitmap(SkBitmap*bitmap,intformat,intwidth,intheight,boolallocPixels)
- {
- switch(format)
- {
- casePIXEL_FORMAT_RGBA_8888:
- bitmap->setConfig(SkBitmap::kARGB_8888_Config,width,height);
- break;
- casePIXEL_FORMAT_RGBA_4444:
- bitmap->setConfig(SkBitmap::kARGB_4444_Config,width,height);
- break;
- casePIXEL_FORMAT_RGB_565:
- bitmap->setConfig(SkBitmap::kRGB_565_Config,width,height);
- break;
- casePIXEL_FORMAT_A_8:
- bitmap->setConfig(SkBitmap::kA8_Config,width,height);
- break;
- default:
- bitmap->setConfig(SkBitmap::kNo_Config,width,height);
- break;
- }
- if(allocPixels)
- {
- bitmap->setIsOpaque(true);
- //--allocarrayofpixels
- if(!bitmap->allocPixels())
- {
- return-1;
- }
- }
- return0;
- }
- intAndroidSurface_register(JNIEnv*env,jobjectjsurface)
- {
- __android_log_print(ANDROID_LOG_INFO,TAG,"registeringvideosurface");
- sSurface=getNativeSurface(env,jsurface);
- if(sSurface==NULL)
- {
- returnANDROID_SURFACE_RESULT_JNI_EXCEPTION;
- }
- __android_log_print(ANDROID_LOG_INFO,TAG,"registered");
- returnANDROID_SURFACE_RESULT_SUCCESS;
- }
- intAndroidSurface_getPixels(intwidth,intheight,void**pixels)
- {
- __android_log_print(ANDROID_LOG_INFO,TAG,"gettingsurface'spixels%ix%i",width,height);
- if(sSurface==NULL)
- {
- returnANDROID_SURFACE_RESULT_JNI_EXCEPTION;
- }
- if(initBitmap(&sBitmapClient,PIXEL_FORMAT_RGB_565,width,height,true)<0)
- {
- returnANDROID_SURFACE_RESULT_COULDNT_INIT_BITMAP_CLIENT;
- }
- *pixels=sBitmapClient.getPixels();
- __android_log_print(ANDROID_LOG_INFO,TAG,"getted");
- returnANDROID_SURFACE_RESULT_SUCCESS;
- }
- staticvoiddoUpdateSurface()
- {
- SkCanvascanvas(sBitmapSurface);
- SkRectsurface_sBitmapClient;
- SkRectsurface_sBitmapSurface;
- SkMatrixmatrix;
- surface_sBitmapSurface.set(0,0,sBitmapSurface.width(),sBitmapSurface.height());
- surface_sBitmapClient.set(0,0,sBitmapClient.width(),sBitmapClient.height());
- matrix.setRectToRect(surface_sBitmapClient,surface_sBitmapSurface,SkMatrix::kFill_ScaleToFit);
- canvas.drawBitmapMatrix(sBitmapClient,matrix);
- }
- staticintprepareSurfaceBitmap(Surface::SurfaceInfo*info)
- {
- if(initBitmap(&sBitmapSurface,info->format,info->w,info->h,false)<0)
- {
- return-1;
- }
- sBitmapSurface.setPixels(info->bits);
- return0;
- }
- intAndroidSurface_updateSurface()
- {
- staticSurface::SurfaceInfosurfaceInfo;
- if(sSurface==NULL)
- {
- returnANDROID_SURFACE_RESULT_JNI_EXCEPTION;
- }
- if(!Surface::isValid(sSurface))
- {
- returnANDROID_SURFACE_RESULT_NOT_VALID;
- }
- if(sSurface->lock(&surfaceInfo,NULL)<0)
- {
- returnANDROID_SURFACE_RESULT_COULDNT_LOCK;
- }
- if(prepareSurfaceBitmap(&surfaceInfo)<0)
- {
- returnANDROID_SURFACE_RESULT_COULDNT_INIT_BITMAP_SURFACE;
- }
- doUpdateSurface();
- if(sSurface->unlockAndPost()<0)
- {
- returnANDROID_SURFACE_RESULT_COULDNT_UNLOCK_AND_POST;
- }
- returnANDROID_SURFACE_RESULT_SUCCESS;
- }
- intAndroidSurface_unregister()
- {
- __android_log_print(ANDROID_LOG_INFO,TAG,"unregisteringvideosurface");
- __android_log_print(ANDROID_LOG_INFO,TAG,"unregistered");
- returnANDROID_SURFACE_RESULT_SUCCESS;
- }
改完以后,编译出来的apk就是可以播放的,但是效果相当的差,问题太多了,需要时间来分析一下。