package com.netease.nim.demo.avchat; import android.os.Environment; import android.os.SystemClock; import android.util.Log; import com.netease.nimlib.sdk.avchat.model.AVChatExternalVideoRender; import com.netease.nimlib.sdk.avchat.model.AVChatI420Frame; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; /** * Created by liuqijun on 2/27/17. */ public class AVChatFileVideoRender extends AVChatExternalVideoRender { private OutputStream outputStream; private int width; private int height; @Override public void onFrame(AVChatI420Frame i420Frame, int rotation) { int size = i420Frame.calcBufferSize(AVChatI420Frame.AVChatVideoFormat.kVideoI420); ByteBuffer i420Buffer = ByteBuffer.allocateDirect(size); if (i420Frame.convertFrame(AVChatI420Frame.AVChatVideoFormat.kVideoI420, 0, i420Buffer)) { if (needCreateFile(i420Frame.width(), i420Frame.height())) { createFile(i420Frame.width(), i420Frame.height()); } if (outputStream != null) { try { outputStream.write("FRAME\n".getBytes()); byte[] data = new byte[size]; i420Buffer.get(data); outputStream.write(data); } catch (IOException e) { e.printStackTrace(); } } } i420Frame.release(); } @Override public boolean initialize() { return true; } @Override public void release() { super.release(); if (outputStream != null) { try { outputStream.close(); outputStream = null; } catch (IOException e) { e.printStackTrace(); } } } private boolean needCreateFile(int w, int h) { return outputStream == null || width != w || height != h; } private boolean createFile(int w, int h) { String fileName = getAttachedSession() + "_" + w + "x" + h + "_" + SystemClock.elapsedRealtime() + ".y4m"; Log.i("AVChatFileVideoRender", "create file -> " + fileName); if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } final String videoOutPath = Environment.getExternalStorageDirectory().getPath() + "/" + fileName; try { outputStream = new BufferedOutputStream(new FileOutputStream(videoOutPath)); outputStream.write(("YUV4MPEG2 C420 W" + w + " H" + h + " Ip F30:1 A1:1\n").getBytes()); width = w; height = h; return true; } catch (IOException e) { e.printStackTrace(); } return false; } }