android 使用javacv进行录像[模仿vine]
2014-03-08 11:49
246 查看
相关代码如下:
1. 初始化 ffmpeg_recorder
2. 捕捉摄像头视频数据:
3. 捕捉声音数据:
源码:
http://download.csdn.net/detail/wodong/7008905
1. 初始化 ffmpeg_recorder
public void initRecorder() { String ffmpeg_link = parentPath + "/" + "video.mp4"; Log.w(LOG_TAG, "init recorder"); if (yuvIplimage == null) { yuvIplimage = IplImage.create(cameraManager.getDefaultSize().width, cameraManager.getDefaultSize().height, IPL_DEPTH_8U, 2); Log.i(LOG_TAG, "create yuvIplimage"); } Log.i(LOG_TAG, "ffmpeg_url: " + ffmpeg_link); recorder = new FFmpegFrameRecorder(ffmpeg_link, cameraManager.getDefaultSize().width, cameraManager.getDefaultSize().height, 1); recorder.setFormat("mp4"); recorder.setSampleRate(sampleAudioRateInHz); // Set in the surface changed method recorder.setFrameRate(frameRate); Log.i(LOG_TAG, "recorder initialize success"); audioRecordRunnable = new AudioRecordRunnable(); audioThread = new Thread(audioRecordRunnable); try { recorder.start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } audioThread.start(); }
2. 捕捉摄像头视频数据:
public void onPreviewFrame(byte[] data, Camera camera) { int during = checkIfMax(new Date().getTime()); /* get video data */ if (yuvIplimage != null && isStart) { yuvIplimage.getByteBuffer().put(data); //yuvIplimage = rotateImage(yuvIplimage.asCvMat(), 90).asIplImage(); Log.v(LOG_TAG, "Writing Frame"); try { System.out.println(System.currentTimeMillis() - videoStartTime); if (during < 6000) { recorder.setTimestamp(1000 * during); recorder.record(yuvIplimage); } } catch (FFmpegFrameRecorder.Exception e) { Log.v(LOG_TAG, e.getMessage()); e.printStackTrace(); } } }
3. 捕捉声音数据:
class AudioRecordRunnable implements Runnable { @Override public void run() { android.os.Process .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); // Audio int bufferSize; short[] audioData; int bufferReadResult; bufferSize = AudioRecord.getMinBufferSize(sampleAudioRateInHz, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleAudioRateInHz, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); audioData = new short[bufferSize]; Log.d(LOG_TAG, "audioRecord.startRecording()"); audioRecord.startRecording(); /* ffmpeg_audio encoding loop */ while (!isFinished) { // Log.v(LOG_TAG,"recording? " + recording); bufferReadResult = audioRecord.read(audioData, 0, audioData.length); if (bufferReadResult > 0) { // Log.v(LOG_TAG, "bufferReadResult: " + bufferReadResult); // If "recording" isn't true when start this thread, it // never get's set according to this if statement...!!! // Why? Good question... if (isStart) { try { Buffer[] barray = new Buffer[1]; barray[0] = ShortBuffer.wrap(audioData, 0, bufferReadResult); recorder.record(barray); // Log.v(LOG_TAG,"recording " + 1024*i + " to " + // 1024*i+1024); } catch (FFmpegFrameRecorder.Exception e) { Log.v(LOG_TAG, e.getMessage()); e.printStackTrace(); } } } } Log.v(LOG_TAG, "AudioThread Finished, release audioRecord"); /* encoding finish, release recorder */ if (audioRecord != null) { audioRecord.stop(); audioRecord.release(); audioRecord = null; Log.v(LOG_TAG, "audioRecord released"); } } }
源码:
http://download.csdn.net/detail/wodong/7008905
相关文章推荐
- android中src和background区别
- Android学习笔记第三弹之各种Activity
- Android游戏开发---2D游戏中背景的绘制
- Android学习笔记第二弹之事件处理
- Android中Bitmap和Drawable
- Android相对布局实现各种梅花效果
- 【Android-jni】JNI学习第一天
- android学习日记0--开发需要掌握的技能
- (转)Android学习:SeekBar实现音量调节
- Android中Spinner的使用方法
- FragmentTest学习笔记2
- FragmentTest学习笔记1
- Android五大布局详解
- android JNI学习七
- Android 众多的布局属性详解
- Android应用程序访问远程数据库(mysql) is not allowed to connect to this MySQL server
- Android入门第八篇之GridView(九宫图)
- Android 4.3 or later Bitmap 内存占用问题
- Android应用程序组件Content Provider应用实例
- Android宝典入门篇-进阶