Recently, many people asked me where to set SPS and PPS. In fact, this article is just a simple implementation of my previous article.
For more information, see the previous article.
Http://blog.csdn.net/zblue78/archive/2010/12/15/6078040.aspx
Here, we only use HTC G7 for the h264 program. Sorry!
Csdn resources are too slow to stick code.
Resource http://download.csdn.net/source/2918751
Welcome to my blog
Http://blog.csdn.net/zblue78/
For mutual discussion, the code is directly obtained without saying anything.
Androidmanifest. xml
<? XML version = "1.0" encoding = "UTF-8"?> <Br/> <manifest xmlns: Android = "http://schemas.android.com/apk/res/android" <br/> package = "com. zjzhang "<br/> Android: versioncode =" 1 "<br/> Android: versionname =" 1.0 "> <br/> <application Android: icon = "@ drawable/icon" Android: Label = "@ string/app_name" Android: debuggable = "true"> <br/> <activity Android: Name = ". videocameraactivity "<br/> Android: screenorientation =" Landscape "<br/> Android: label = "@ string/app_name"> <br/> <intent-filter> <br/> <action Android: Name = "android. intent. action. main "/> <br/> <category Android: Name =" android. intent. category. launcher "/> <br/> </intent-filter> <br/> </activity> <br/> </Application> <br/> <uses-SDK Android: minsdkversion = "3"/> <br/> <uses-Permission Android: Name = "android. permission. internet "/> <br/> <uses-Permission Android: Name =" android. permission. camera "/> <br/> <uses-Permission Android: Name =" android. permission. record_video "/> <br/> <uses-Permission Android: Name =" android. permission. record_audio "/> <br/> <uses-Permission Android: Name =" android. permission. write_external_storage "/> <br/> </manifest>
Main. xml
<? XML version = "1.0" encoding = "UTF-8"?> <Br/> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" <br/> Android: Orientation = "vertical" <br/> Android: layout_width = "fill_parent" <br/> Android: layout_height = "fill_parent" <br/> <surfaceview <br/> Android: id = "@ + ID/surface_camera" <br/> Android: layout_width = "176px" <br/> Android: layout_height = "144px" <br/> Android: layout_alignparentright = "true" <br/> Android: layout_alignparenttop = "true" <br/> </linearlayout> <br/>
Package COM. zjzhang; <br/> Import Java. io. datainputstream; <br/> Import Java. io. file; <br/> Import Java. io. ioexception; <br/> Import Java. io. inputstream; <br/> Import Java. io. randomaccessfile; <br/> Import android. app. activity; <br/> Import android. content. context; <br/> Import android. OS. bundle; <br/> Import android. graphics. pixelformat; <br/> Import android. media. mediarecorder; <br/> Import android.net. loca Lserversocket; <br/> Import android.net. localsocket; <br/> Import android.net. localsocketaddress; <br/> Import android. util. log; <br/> Import android. view. surfaceholder; <br/> Import android. view. surfaceview; <br/> Import android. view. view; <br/> Import android. view. window; <br/> Import android. view. windowmanager; <br/> public class videocameraactivity extends activity implements <br/> surfaceholder. callbac K, mediarecorder. onerrorlistener, <br/> mediarecorder. oninfolistener {<br/> Private Static final int mvideoencoder = mediarecorder. videoencoder. h264; <br/> Private Static final string tag = "videocamera"; <br/> localsocket handler er, sender; <br/> localserversocket LSS; <br/> private mediarecorder mmediarecorder = NULL; <br/> Boolean mmediarecorderrecording = false; <br/> private surfaceview msurfaceview = NULL; <br/> private surfaceholder msurfaceholder = NULL; <br/> thread t; <br/> context mcontext = This; <br/> randomaccessfile RAF = NULL; <br/> @ override <br/> Public void oncreate (bundle savedinstancestate) {<br/> super. oncreate (savedinstancestate); <br/> getwindow (). setformat (pixelformat. translucent); <br/> requestwindowfeature (window. feature_no_title); <br/> getwindow (). setflags (windowmanager. layoutpa Rams. flag_fullscreen, <br/> windowmanager. layoutparams. flag_fullscreen); <br/> setcontentview (R. layout. main); <br/> msurfaceview = (surfaceview) This. findviewbyid (R. id. surface_camera); <br/> surfaceholder holder = msurfaceview. getholder (); <br/> holder. addcallback (this); <br/> holder. settype (surfaceholder. surface_type_push_buffers); <br/> msurfaceview. setvisibility (view. visible); <br/> extends ER = new loca Lsocket (); <br/> try {<br/> LSS = new localserversocket ("videocamera"); <br/> receiver er. connect (New localsocketaddress ("videocamera"); <br/> receiver er. setreceivebuffersize (500000); <br/> receiver er. setsendbuffersize (500000); <br/> sender = lss. accept (); <br/> sender. setreceivebuffersize (500000); <br/> sender. setsendbuffersize (500000); <br/>} catch (ioexception e) {<br/> finish (); <br/> return; <br/>}< Br/> @ override <br/> Public void onstart () {<br/> super. onstart (); <br/>}< br/> @ override <br/> Public void onresume () {<br/> super. onresume (); <br/>}< br/> @ override <br/> Public void onpause () {<br/> super. onpause (); <br/> If (mmediarecorderrecording) {<br/> stopvideorecording (); <br/> try {<br/> lss. close (); <br/> cycler. close (); <br/> sender. close (); <br/>}catch (ioexception e) {<br/> E. printstacktr ACE (); <br/>}< br/> finish (); <br/>}< br/> private void stopvideorecording () {<br/> log. D (TAG, "stopvideorecording"); <br/> If (mmediarecorderrecording | mmediarecorder! = NULL) {<br/> If (T! = NULL) <br/> T. interrupt (); <br/> try {<br/> Raf. close (); <br/>}catch (ioexception e) {<br/> // todo auto-generated Catch Block <br/> E. printstacktrace (); <br/>}< br/> releasemediarecorder (); <br/>}< br/> private void startvideorecording () {<br/> log. D (TAG, "startvideorecording"); <br/> (t = new thread () {<br/> Public void run () {<br/> int frame_size = 1024; <br/> byte [] buffer = new byte [1024 * 64]; <br/> int num, number = 0; <br/> inputstream FCM = NULL; <br/> try {<br/> FD = ER er. getinputstream (); <br/>} catch (ioexception E1) {<br/> return; <br/>}< br/> try {<br/> thread. currentthread (). sleep (500); <br/>} catch (interruptedexception E1) {<br/> e1.printstacktrace (); <br/>}< br/> Number = 0; <br/> releasemediarecorder (); <br/> // if it is h264 or mpeg_4_sp, you need to find the stream of the corresponding parameter settings here <br/> // set parameter of avcc box h264 Number <br/> // set parameters of ESDs box mpeg_4_sp <br/> // In fact, if the resolution and other values remain unchanged, these parameters will not change, <br/> // then I only need to confirm it at the first run. <br/> while (true) {<br/> try {<br/> num = Fi. read (buffer, number, frame_size); <br/> Number + = num; <br/> If (Num <frame_size) {<br/> break; <br/>}< br/>} catch (ioexception e) {<br/> break; <br/>}</P> <p> initializevideo (); <br/> Number = 0; <br/> // restart the capture, to obtain the video stream <br/> datainputstream Dis = new DA Tainputstream (FCM); </P> <p> // read the first 32 empty positions. <br/> try {<br/> dis. read (buffer, 0, 32); <br/>} catch (ioexception E1) {<br/> // todo auto-generated Catch Block <br/> e1.printstacktrace (); <br/>}</P> <p> try {<br/> file = new file ("/sdcard/stream. h264 "); <br/> If (file. exists () <br/> file. delete (); <br/> RAF = new randomaccessfile (file, "RW"); <br/>} catch (exception ex) {<br/> log. V ("system. out ", Ex. toS Tring (); <br/>}</P> <p> // These parameters correspond to my current video settings. If you want to change these parameters, confirm them again, <br/> // Of course, I don't know if different machines are the same. I only have one HTC G7 for testing. <Br/> byte [] hsf-sps = {0x67,0x42,0x00, 0x0c, (byte) 0x96,0x54, 0x0b, 0x04, (byte) 0xa2 }; <br/> byte [] hsf-pps = {0x68, (byte) 0xce, 0x38, (byte) 0x80 }; <br/> byte [] hsf-head = {0, 0, 1}; <br/> try {<br/> Raf. write (hsf-head); <br/> Raf. write (hsf-sps); <br/> Raf. write (hsf-head); <br/> Raf. write (hsf-pps); <br/>} catch (ioexception E1) {<br/> // todo auto-generated Catch Block <br/> e1.printstacktrace (); <br/>}< br/> while (True) <br/>{< br/> try {<br/> // read the length of each game <br/> int hsf-length = dis. readint (); <br/> Number = 0; <br/> Raf. write (hsf-head); <br/> while (number <psf-length) <br/>{< br/> int lost = h264length-number; <br/> num = Fi. read (buffer, 0, frame_size <lost? Frame_size: Lost); <br/> log. D (TAG, String. format ("h264% d, % d, % d", hsf-length, number, num); <br/> Number + = num; <br/> Raf. write (buffer, 0, num); <br/>}< br/>} catch (ioexception e) {<br/> break; <br/>}< br/> }). start (); <br/>}< br/> private Boolean initializevideo () {<br/> If (msurfaceholder = NULL) <br/> return false; <br/> mmediarecorderrecording = true; <br/> If (mmediarecorder = NULL) <br/> m Mediarecorder = new mediarecorder (); <br/> else <br/> mmediarecorder. reset (); <br/> mmediarecorder. setvideosource (mediarecorder. videosource. camera); <br/> mmediarecorder. setoutputformat (mediarecorder. outputformat. three_gpp); <br/> mmediarecorder. setvideoframerate (20); <br/> mmediarecorder. setvideosize (352,288); <br/> mmediarecorder. setvideoencoder (mvideoencoder); <br/> mmediarecorder. setpreviewdisplay (MS Urfaceholder. getsurface (); <br/> mmediarecorder. setmaxduration (0); <br/> mmediarecorder. setmaxfilesize (0); <br/> mmediarecorder. setoutputfile (sender. getfiledescriptor (); <br/> try {<br/> mmediarecorder. setoninfolistener (this); <br/> mmediarecorder. setonerrorlistener (this); <br/> mmediarecorder. prepare (); <br/> mmediarecorder. start (); <br/>}catch (ioexception exception) {<br/> releasemediarecorder (); <B R/> finish (); <br/> return false; <br/>}< br/> return true; <br/>}< br/> private void releasemediarecorder () {<br/> log. V (TAG, "releasing media recorder. "); <br/> If (mmediarecorder! = NULL) {<br/> If (mmediarecorderrecording) {<br/> try {<br/> mmediarecorder. setonerrorlistener (null); <br/> mmediarecorder. setoninfolistener (null); <br/> mmediarecorder. stop (); <br/>}catch (runtimeexception e) {<br/> log. E (TAG, "Stop fail:" + E. getmessage (); <br/>}< br/> mmediarecorderrecording = false; <br/>}< br/> mmediarecorder. reset (); <br/> mmediarecorder. release (); <br/> mmediarecorder = NULL; <BR/>}< br/> @ override <br/> Public void surfacechanged (surfaceholder holder, int format, int W, int H) {<br/> log. D (TAG, "surfacechanged"); <br/> msurfaceholder = holder; <br/> If (! Mmediarecorderrecording) {<br/> initializevideo (); <br/> startvideorecording (); <br/>}< br/> @ override <br/> Public void surfacecreated (surfaceholder holder) {<br/> log. D (TAG, "surfacecreated"); <br/> msurfaceholder = holder; <br/>}< br/> @ override <br/> Public void surfacedestroyed (surfaceholder holder) {<br/> log. D (TAG, "surfacedestroyed"); <br/> msurfaceholder = NULL; <br/>}< br/> @ override <br/> Public void oninfo (mediarecorder Mr, int what, int extra) {<br/> switch (what) {<br/> case mediarecorder. media_recorder_info_unknown: <br/> log. D (TAG, "media_recorder_info_unknown"); <br/> break; <br/> case mediarecorder. media_recorder_info_max_duration_reached: <br/> log. D (TAG, "media_recorder_info_max_duration_reached"); <br/> break; <br/> case mediarecorder. media_recorder_info_max_filesize_reached: <br/> log. D (TAG, "media_recorder_info_max_filesize_reached"); <br/> break; <br/>}< br/> @ override <br/> Public void onerror (mediarecorder Mr, int what, int extra) {<br/> If (what = mediarecorder. media_recorder_error_unknown) {<br/> log. D (TAG, "media_recorder_error_unknown"); <br/> finish (); <br/>}< br/>}