转载:http://blog.csdn.net/zblue78/article/details/6083374
最近很多同学问我SPS和PPS在那里设置,其实这篇文章只是我 上篇文章的一个简单实现
具体情况情看看上一篇
http://blog.csdn.net/zblue78/archive/2010/12/15/6078040.aspx
这里只用HTC的G7做了H264的程序,谅解!
csdn的资源慢了 粘代码算了
资源 http://download.csdn.net/source/2918751
欢迎大家经常访问我的bloghttp://blog.csdn.net/zblue78/
共同探讨,啥也不说的 直接上码
AndroidManifest.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifestxmlns:android="http://schemas.android.com/apk/res/android"
- package="com.zjzhang"
- android:versionCode="1"
- android:versionName="1.0">
- <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"android:debuggable="true">
- <activityandroid:name=".VideoCameraActivity"
- android:screenOrientation="landscape"
- android:label="@string/app_name">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- </application>
- <uses-sdkandroid:minSdkVersion="3"/>
- <uses-permissionandroid:name="android.permission.INTERNET"/>
- <uses-permissionandroid:name="android.permission.CAMERA"/>
- <uses-permissionandroid:name="android.permission.RECORD_VIDEO"/>
- <uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- </manifest>
main.xml
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <SurfaceView
- android:id="@+id/surface_camera"
- android:layout_width="176px"
- android:layout_height="144px"
- android:layout_alignParentRight="true"
- android:layout_alignParentTop="true"
- />
- </LinearLayout>
- packagecom.zjzhang;
- importjava.io.DataInputStream;
- importjava.io.File;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.RandomAccessFile;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.os.Bundle;
- importandroid.graphics.PixelFormat;
- importandroid.media.MediaRecorder;
- importandroid.net.LocalServerSocket;
- importandroid.net.LocalSocket;
- importandroid.net.LocalSocketAddress;
- importandroid.util.Log;
- importandroid.view.SurfaceHolder;
- importandroid.view.SurfaceView;
- importandroid.view.View;
- importandroid.view.Window;
- importandroid.view.WindowManager;
- publicclassVideoCameraActivityextendsActivityimplements
- SurfaceHolder.Callback,MediaRecorder.OnErrorListener,
- MediaRecorder.OnInfoListener{
- privatestaticfinalintmVideoEncoder=MediaRecorder.VideoEncoder.H264;
- privatestaticfinalStringTAG="VideoCamera";
- LocalSocketreceiver,sender;
- LocalServerSocketlss;
- privateMediaRecordermMediaRecorder=null;
- booleanmMediaRecorderRecording=false;
- privateSurfaceViewmSurfaceView=null;
- privateSurfaceHoldermSurfaceHolder=null;
- Threadt;
- ContextmContext=this;
- RandomAccessFileraf=null;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- getWindow().setFormat(PixelFormat.TRANSLUCENT);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.main);
- mSurfaceView=(SurfaceView)this.findViewById(R.id.surface_camera);
- SurfaceHolderholder=mSurfaceView.getHolder();
- holder.addCallback(this);
- holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- mSurfaceView.setVisibility(View.VISIBLE);
- receiver=newLocalSocket();
- try{
- lss=newLocalServerSocket("VideoCamera");
- receiver.connect(newLocalSocketAddress("VideoCamera"));
- receiver.setReceiveBufferSize(500000);
- receiver.setSendBufferSize(500000);
- sender=lss.accept();
- sender.setReceiveBufferSize(500000);
- sender.setSendBufferSize(500000);
- }catch(IOExceptione){
- finish();
- return;
- }
- }
- @Override
- publicvoidonStart(){
- super.onStart();
- }
- @Override
- publicvoidonResume(){
- super.onResume();
- }
- @Override
- publicvoidonPause(){
- super.onPause();
- if(mMediaRecorderRecording){
- stopVideoRecording();
- try{
- lss.close();
- receiver.close();
- sender.close();
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- finish();
- }
- privatevoidstopVideoRecording(){
- Log.d(TAG,"stopVideoRecording");
- if(mMediaRecorderRecording||mMediaRecorder!=null){
- if(t!=null)
- t.interrupt();
- try{
- raf.close();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- releaseMediaRecorder();
- }
- }
- privatevoidstartVideoRecording(){
- Log.d(TAG,"startVideoRecording");
- (t=newThread(){
- publicvoidrun(){
- intframe_size=1024;
- byte[]buffer=newbyte[1024*64];
- intnum,number=0;
- InputStreamfis=null;
- try{
- fis=receiver.getInputStream();
- }catch(IOExceptione1){
- return;
- }
- try{
- Thread.currentThread().sleep(500);
- }catch(InterruptedExceptione1){
- e1.printStackTrace();
- }
- number=0;
- releaseMediaRecorder();
- //如果是H264或是MPEG_4_SP的就要在这里找到相应的设置参数的流
- //avcCboxH264的设置参数
- //esdsboxMPEG_4_SP的设置参数
- //其实如果分辨率等数值不变的话,这些参数是不会变化的,
- //那么我就只需要在第一次运行的时候确定就可以了
- while(true){
- try{
- num=fis.read(buffer,number,frame_size);
- number+=num;
- if(num<frame_size){
- break;
- }
- }catch(IOExceptione){
- break;
- }
- }
- initializeVideo();
- number=0;
- //重新启动捕获,以获取视频流
- DataInputStreamdis=newDataInputStream(fis);
- //读取最前面的32个自己的空头
- try{
- dis.read(buffer,0,32);
- }catch(IOExceptione1){
- //TODOAuto-generatedcatchblock
- e1.printStackTrace();
- }
- try{
- Filefile=newFile("/sdcard/stream.h264");
- if(file.exists())
- file.delete();
- raf=newRandomAccessFile(file,"rw");
- }catch(Exceptionex){
- Log.v("System.out",ex.toString());
- }
- //这些参数要对应我现在的视频设置,如果想变化的话需要去重新确定,
- //当然不知道是不是不同的机器是不是一样,我这里只有一个HTCG7做测试。
- byte[]h264sps={0x67,0x42,0x00,0x0C,(byte)0x96,0x54,0x0B,0x04,(byte)0xA2};
- byte[]h264pps={0x68,(byte)0xCE,0x38,(byte)0x80};
- byte[]h264head={0,0,0,1};
- try{
- raf.write(h264head);
- raf.write(h264sps);
- raf.write(h264head);
- raf.write(h264pps);
- }catch(IOExceptione1){
- //TODOAuto-generatedcatchblock
- e1.printStackTrace();
- }
- while(true)
- {
- try{
- //读取每场的长度
- inth264length=dis.readInt();
- number=0;
- raf.write(h264head);
- while(number<h264length)
- {
- intlost=h264length-number;
- num=fis.read(buffer,0,frame_size<lost?frame_size:lost);
- Log.d(TAG,String.format("H264%d,%d,%d",h264length,number,num));
- number+=num;
- raf.write(buffer,0,num);
- }
- }catch(IOExceptione){
- break;
- }
- }
- }
- }).start();
- }
- privatebooleaninitializeVideo(){
- if(mSurfaceHolder==null)
- returnfalse;
- mMediaRecorderRecording=true;
- if(mMediaRecorder==null)
- mMediaRecorder=newMediaRecorder();
- else
- mMediaRecorder.reset();
- mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
- mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
- mMediaRecorder.setVideoFrameRate(20);
- mMediaRecorder.setVideoSize(352,288);
- mMediaRecorder.setVideoEncoder(mVideoEncoder);
- mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
- mMediaRecorder.setMaxDuration(0);
- mMediaRecorder.setMaxFileSize(0);
- mMediaRecorder.setOutputFile(sender.getFileDescriptor());
- try{
- mMediaRecorder.setOnInfoListener(this);
- mMediaRecorder.setOnErrorListener(this);
- mMediaRecorder.prepare();
- mMediaRecorder.start();
- }catch(IOExceptionexception){
- releaseMediaRecorder();
- finish();
- returnfalse;
- }
- returntrue;
- }
- privatevoidreleaseMediaRecorder(){
- Log.v(TAG,"Releasingmediarecorder.");
- if(mMediaRecorder!=null){
- if(mMediaRecorderRecording){
- try{
- mMediaRecorder.setOnErrorListener(null);
- mMediaRecorder.setOnInfoListener(null);
- mMediaRecorder.stop();
- }catch(RuntimeExceptione){
- Log.e(TAG,"stopfail:"+e.getMessage());
- }
- mMediaRecorderRecording=false;
- }
- mMediaRecorder.reset();
- mMediaRecorder.release();
- mMediaRecorder=null;
- }
- }
- @Override
- publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intw,inth){
- Log.d(TAG,"surfaceChanged");
- mSurfaceHolder=holder;
- if(!mMediaRecorderRecording){
- initializeVideo();
- startVideoRecording();
- }
- }
- @Override
- publicvoidsurfaceCreated(SurfaceHolderholder){
- Log.d(TAG,"surfaceCreated");
- mSurfaceHolder=holder;
- }
- @Override
- publicvoidsurfaceDestroyed(SurfaceHolderholder){
- Log.d(TAG,"surfaceDestroyed");
- mSurfaceHolder=null;
- }
- @Override
- publicvoidonInfo(MediaRecordermr,intwhat,intextra){
- switch(what){
- caseMediaRecorder.MEDIA_RECORDER_INFO_UNKNOWN:
- Log.d(TAG,"MEDIA_RECORDER_INFO_UNKNOWN");
- break;
- caseMediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED:
- Log.d(TAG,"MEDIA_RECORDER_INFO_MAX_DURATION_REACHED");
- break;
- caseMediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED:
- Log.d(TAG,"MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED");
- break;
- }
- }
- @Override
- publicvoidonError(MediaRecordermr,intwhat,intextra){
- if(what==MediaRecorder.MEDIA_RECORDER_ERROR_UNKNOWN){
- Log.d(TAG,"MEDIA_RECORDER_ERROR_UNKNOWN");
- finish();
- }
- }
- }