织梦CMS - 轻松建站从此开始!

罗索实验室

当前位置: 主页 > 流媒体开发 > 流媒体开发 >

庆祝一下,Android视频采集+H264编码成功

jackyhwei 发布于 2011-06-28 09:49 点击:次 
编码器使用的是x264的开源库,很容易看懂的简单的封装了一个JNI库,部分代码直接使用了mcodec的Android解码器源代码-Android 1.6版。
TAG:

编码器使用的是x264的开源库,

很容易看懂的

简单的封装了一个JNI库

编码库在BBS里 CSDN的资源太难用了

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=52739&extra=

x264的编译放方法

export ARM_ROOT=$ANDROID_NDK_ROOT
export ARM_INC=$ARM_ROOT/build/platforms/android-5/arch-arm/usr/include/
export ARM_LIB=$ARM_ROOT/build/platforms/android-5/arch-arm/usr/lib/
export ARM_TOOL=$ARM_ROOT/build/prebuilt/windows/arm-eabi-4.4.0
export ARM_LIBO=$ARM_TOOL/lib/gcc/arm-eabi/4.4.0
export PATH=$ARM_TOOL/bin:$PATH
export ARM_PRE=arm-eabi

./configure --prefix=/home/egmkang/libx264 --enable-shared \
-disable-asm --host=arm-linux --cross-prefix=arm-eabi-\
--extra-cflags=" -I$ARM_INC -fPIC -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID  -Wa,--noexecstack -MMD -MP "\
--extra-ldflags="-nostdlib -Bdynamic -Wl,--no-undefined -Wl,-z,noexecstack  -Wl,-z,nocopyreloc -Wl,-soname,/system/lib/libz.so -Wl,-rpath-link=$ARM_LIB,-dynamic-linker=/system/bin/linker -L$ARM_LIB -nostdlib $ARM_LIB/crtbegin_dynamic.o $ARM_LIB/crtend_android.o -lc -lm -ldl -lgcc"

这里生成的是x264的静态库

整个工程唯一有点麻烦的是 生成 JNI 动态库的时候 报错 。。

后来发现是少链接了一个库,

于是根据x264的编译方法 在Android.mk添加一些配置就可以了。当然这就是难点,在网上查了很多都没有结果。

有些目录的参数自己调整哈

我把前面生成的libx264.a 和 x264.h 文件放到jni的libx264目录下了 有问题自己调整

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES +=$(LOCAL_PATH)/libx264/include
LOCAL_MODULE    := H264Android
LOCAL_SRC_FILES := H264Android.c
LOCAL_LDFLAGS += $(LOCAL_PATH)/libx264/lib/libx264.a
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lgcc


include $(BUILD_SHARED_LIBRARY)

估计很多人都会发现很熟悉 嘻嘻 这个就是根据:http://www.rosoo.net/a/201106/14632.html

改的 连文件名字都没有换!!比较懒

另: 编码的效率很低下啊

AndroidVideo.java

  1. import java.io.File; 
  2. import java.io.RandomAccessFile; 
  3. import android.app.Activity; 
  4. import android.content.Intent; 
  5. import android.os.Bundle; 
  6. import android.view.View; 
  7. import android.content.res.Configuration; 
  8. import android.os.Bundle; 
  9. import android.util.Log; 
  10. import android.view.SurfaceHolder; 
  11. import android.view.SurfaceView; 
  12. import android.view.Window; 
  13. import android.view.WindowManager; 
  14. import android.view.SurfaceHolder.Callback; 
  15. import android.graphics.PixelFormat; 
  16. import android.hardware.Camera; 
  17. public class AndroidVideo extends Activity implements Callback, 
  18.         Camera.PictureCallback { 
  19.     private SurfaceView mSurfaceView = null; 
  20.     private SurfaceHolder mSurfaceHolder = null; 
  21.     private Camera mCamera = null; 
  22.     private boolean mPreviewRunning = false
  23.     public void onCreate(Bundle savedInstanceState) { 
  24.         super.onCreate(savedInstanceState); 
  25.         getWindow().setFormat(PixelFormat.TRANSLUCENT); 
  26.         requestWindowFeature(Window.FEATURE_NO_TITLE); 
  27.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
  28.                 WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  29.         setContentView(R.layout.camera); 
  30.         mSurfaceView = (SurfaceView) this.findViewById(R.id.surface_camera); 
  31.         mSurfaceHolder = mSurfaceView.getHolder(); 
  32.         mSurfaceHolder.addCallback(this); 
  33.         mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
  34.     } 
  35.      
  36.     @Override 
  37.     public void onPictureTaken(byte[] data, Camera camera) { 
  38.     } 
  39.     @Override 
  40.     public void surfaceChanged(SurfaceHolder holder, int format, int width, 
  41.             int height) { 
  42.         if (mPreviewRunning) { 
  43.             mCamera.stopPreview(); 
  44.         } 
  45.         Camera.Parameters p = mCamera.getParameters(); 
  46.         p.setPreviewSize(352, 288); 
  47.         mCamera.setPreviewCallback(new H264Encoder(352, 288)); 
  48.         mCamera.setParameters(p); 
  49.         try { 
  50.             mCamera.setPreviewDisplay(holder); 
  51.         } catch (Exception ex) { 
  52.         } 
  53.         mCamera.startPreview(); 
  54.         mPreviewRunning = true
  55.     } 
  56.     @Override 
  57.     public void surfaceCreated(SurfaceHolder holder) { 
  58.         mCamera = Camera.open(); 
  59.     } 
  60.     @Override 
  61.     public void surfaceDestroyed(SurfaceHolder holder) { 
  62.         if (mCamera != null) { 
  63.             mCamera.setPreviewCallback(null); 
  64.             mCamera.stopPreview(); 
  65.             mPreviewRunning = false
  66.             mCamera.release(); 
  67.             mCamera = null; 
  68.         } 
  69.     } 
  70.     public void onConfigurationChanged(Configuration newConfig) { 
  71.         try { 
  72.             super.onConfigurationChanged(newConfig); 
  73.             if (this.getResources().getConfiguration().orientation
  74.  == Configuration.ORIENTATION_LANDSCAPE) { 
  75.             } else if (this.getResources().getConfiguration().orientation
  76.  == Configuration.ORIENTATION_PORTRAIT) { 
  77.             } 
  78.         } catch (Exception ex) { 
  79.         } 
  80.     } 
  81. class H264Encoder implements Camera.PreviewCallback { 
  82.     long encoder=0; 
  83.     RandomAccessFile raf=null; 
  84.     byte[] h264Buff =null; 
  85.     static { 
  86.         System.loadLibrary("H264Android"); 
  87.     } 
  88.     private H264Encoder(){}; 
  89.      
  90.     public H264Encoder(int width, int height) { 
  91.         encoder = CompressBegin(width, height); 
  92.         h264Buff = new byte[width * height *8]; 
  93.         try { 
  94.             File file = new File("/sdcard/camera.h264"); 
  95.             raf = new RandomAccessFile(file, "rw"); 
  96.         } catch (Exception ex) { 
  97.             Log.v("System.out", ex.toString()); 
  98.         } 
  99.          
  100.     }; 
  101.     protected void finalize() 
  102.     { 
  103.         CompressEnd(encoder); 
  104.         if (null != raf) 
  105.         { 
  106.             try { 
  107.                 raf.close(); 
  108.             } catch (Exception ex) { 
  109.                 Log.v("System.out", ex.toString()); 
  110.             } 
  111.         } 
  112.         try { 
  113.             super.finalize(); 
  114.         } catch (Throwable e) { 
  115.             // TODO Auto-generated catch block 
  116.             e.printStackTrace(); 
  117.         } 
  118.     } 
  119.     private native long CompressBegin(int width,int height); 
  120.     private native int CompressBuffer(long encoder, int type,byte[] in
  121. int insize,byte[] out); 
  122.     private native int CompressEnd(long encoder); 
  123.     @Override 
  124.     public void onPreviewFrame(byte[] data, Camera camera) {     
  125.          
  126.         int result=CompressBuffer(encoder, -1, data, data.length,h264Buff); 
  127.         try { 
  128.             if (result>0) 
  129.                 raf.write(h264Buff, 0, result); 
  130.         } catch (Exception ex) { 
  131.             Log.v("System.out", ex.toString()); 
  132.         } 
  133.     } 
  134.      

(zblue78)

本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www1.rosoo.net/a/201106/14633.html]
本文出处:blog.csdn.net/zblue78 作者:zblue78
顶一下
(15)
75%
踩一下
(5)
25%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容