Article [Android video encoding h263 mp4v h264] Code Implementation

Source: Internet
Author: User

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/>}

 

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.