移植FFmpeg到android ics

本文介绍将FFmpeg移植到Android平台的过程,包括下载现成的移植版本、修改源码以适应Android ICS系统,并解决编译错误等问题。文中还提供了一个用于视频播放的示例,展示了如何在Android中使用FFmpeg。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想弄个小东西,自己练习一下,就想到把FFmpeg移植到android上面

网上有现成的2.2的移植,可以下载下来,链接https://github.com/havlenapetr,里面的ffmpeg和framework下面的libaudio和libviedo两个so,就是全部的东西。

看过一些东西,都说不开放某些代码,挺没劲的,人家都已经放出全部代码了,有什么藏匿的。

app下面的代码几乎不需要修改,就是一些编译的错误,就是framework下面的本地适配需要需要改一下,适应一下ics,就是surface.cpp这个文件。

  1. /*
  2. *Copyright(C)2009TheAndroidOpenSourceProject
  3. *
  4. *LicensedundertheApacheLicense,Version2.0(the"License");
  5. *youmaynotusethisfileexceptincompliancewiththeLicense.
  6. *YoumayobtainacopyoftheLicenseat
  7. *
  8. *http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
  11. *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
  12. *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
  13. *SeetheLicenseforthespecificlanguagegoverningpermissionsand
  14. *limitationsundertheLicense.
  15. */
  16. #include<android/surface.h>
  17. #include<surfaceflinger/Surface.h>
  18. #include<utils/Log.h>
  19. #include<SkBitmap.h>
  20. #include<SkCanvas.h>
  21. #defineTAG"SurfaceWrapper"
  22. usingnamespaceandroid;
  23. staticSurface*sSurface;
  24. staticSkBitmapsBitmapClient;
  25. staticSkBitmapsBitmapSurface;
  26. staticSurface*getNativeSurface(JNIEnv*env,jobjectjsurface)
  27. {
  28. jclassclazz=env->FindClass("android/view/Surface");
  29. jfieldIDfield_surface=env->GetFieldID(clazz,"mNativeSurface","I");
  30. if(field_surface==NULL)
  31. {
  32. returnNULL;
  33. }
  34. return(Surface*)env->GetIntField(jsurface,field_surface);
  35. }
  36. staticintinitBitmap(SkBitmap*bitmap,intformat,intwidth,intheight,boolallocPixels)
  37. {
  38. switch(format)
  39. {
  40. casePIXEL_FORMAT_RGBA_8888:
  41. bitmap->setConfig(SkBitmap::kARGB_8888_Config,width,height);
  42. break;
  43. casePIXEL_FORMAT_RGBA_4444:
  44. bitmap->setConfig(SkBitmap::kARGB_4444_Config,width,height);
  45. break;
  46. casePIXEL_FORMAT_RGB_565:
  47. bitmap->setConfig(SkBitmap::kRGB_565_Config,width,height);
  48. break;
  49. casePIXEL_FORMAT_A_8:
  50. bitmap->setConfig(SkBitmap::kA8_Config,width,height);
  51. break;
  52. default:
  53. bitmap->setConfig(SkBitmap::kNo_Config,width,height);
  54. break;
  55. }
  56. if(allocPixels)
  57. {
  58. bitmap->setIsOpaque(true);
  59. //--allocarrayofpixels
  60. if(!bitmap->allocPixels())
  61. {
  62. return-1;
  63. }
  64. }
  65. return0;
  66. }
  67. intAndroidSurface_register(JNIEnv*env,jobjectjsurface)
  68. {
  69. __android_log_print(ANDROID_LOG_INFO,TAG,"registeringvideosurface");
  70. sSurface=getNativeSurface(env,jsurface);
  71. if(sSurface==NULL)
  72. {
  73. returnANDROID_SURFACE_RESULT_JNI_EXCEPTION;
  74. }
  75. __android_log_print(ANDROID_LOG_INFO,TAG,"registered");
  76. returnANDROID_SURFACE_RESULT_SUCCESS;
  77. }
  78. intAndroidSurface_getPixels(intwidth,intheight,void**pixels)
  79. {
  80. __android_log_print(ANDROID_LOG_INFO,TAG,"gettingsurface'spixels%ix%i",width,height);
  81. if(sSurface==NULL)
  82. {
  83. returnANDROID_SURFACE_RESULT_JNI_EXCEPTION;
  84. }
  85. if(initBitmap(&sBitmapClient,PIXEL_FORMAT_RGB_565,width,height,true)<0)
  86. {
  87. returnANDROID_SURFACE_RESULT_COULDNT_INIT_BITMAP_CLIENT;
  88. }
  89. *pixels=sBitmapClient.getPixels();
  90. __android_log_print(ANDROID_LOG_INFO,TAG,"getted");
  91. returnANDROID_SURFACE_RESULT_SUCCESS;
  92. }
  93. staticvoiddoUpdateSurface()
  94. {
  95. SkCanvascanvas(sBitmapSurface);
  96. SkRectsurface_sBitmapClient;
  97. SkRectsurface_sBitmapSurface;
  98. SkMatrixmatrix;
  99. surface_sBitmapSurface.set(0,0,sBitmapSurface.width(),sBitmapSurface.height());
  100. surface_sBitmapClient.set(0,0,sBitmapClient.width(),sBitmapClient.height());
  101. matrix.setRectToRect(surface_sBitmapClient,surface_sBitmapSurface,SkMatrix::kFill_ScaleToFit);
  102. canvas.drawBitmapMatrix(sBitmapClient,matrix);
  103. }
  104. staticintprepareSurfaceBitmap(Surface::SurfaceInfo*info)
  105. {
  106. if(initBitmap(&sBitmapSurface,info->format,info->w,info->h,false)<0)
  107. {
  108. return-1;
  109. }
  110. sBitmapSurface.setPixels(info->bits);
  111. return0;
  112. }
  113. intAndroidSurface_updateSurface()
  114. {
  115. staticSurface::SurfaceInfosurfaceInfo;
  116. if(sSurface==NULL)
  117. {
  118. returnANDROID_SURFACE_RESULT_JNI_EXCEPTION;
  119. }
  120. if(!Surface::isValid(sSurface))
  121. {
  122. returnANDROID_SURFACE_RESULT_NOT_VALID;
  123. }
  124. if(sSurface->lock(&surfaceInfo,NULL)<0)
  125. {
  126. returnANDROID_SURFACE_RESULT_COULDNT_LOCK;
  127. }
  128. if(prepareSurfaceBitmap(&surfaceInfo)<0)
  129. {
  130. returnANDROID_SURFACE_RESULT_COULDNT_INIT_BITMAP_SURFACE;
  131. }
  132. doUpdateSurface();
  133. if(sSurface->unlockAndPost()<0)
  134. {
  135. returnANDROID_SURFACE_RESULT_COULDNT_UNLOCK_AND_POST;
  136. }
  137. returnANDROID_SURFACE_RESULT_SUCCESS;
  138. }
  139. intAndroidSurface_unregister()
  140. {
  141. __android_log_print(ANDROID_LOG_INFO,TAG,"unregisteringvideosurface");
  142. __android_log_print(ANDROID_LOG_INFO,TAG,"unregistered");
  143. returnANDROID_SURFACE_RESULT_SUCCESS;
  144. }

改完以后,编译出来的apk就是可以播放的,但是效果相当的差,问题太多了,需要时间来分析一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值