原始视频数据
- Android
更新时间不可用
了解实时互动 RTC 在不同平台上的原始视频数据方式,包括接入流程、关键配置和平台差异。
技术原理
本文介绍如何对采集到的原始视频数据进行前处理和后处理。视频传输过程中,你可以对采集到的视频数据进行前处理和后处理,获取想要的播放效果。
对于有自行处理视频数据需求的场景,声网提供原始数据功能。你可以在将数据发送给编码器前进行前处理,对捕捉到的视频帧进行修改;也可以在将数据发送给解码器后进行后处理,对接收到的视频帧进行修改。
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。
实现方法
参考如下步骤,在你的项目中实现原始视频数据功能:
-
加入频道前,创建一个
IVideoFrameObserver对象,并调用registerVideoFrameObserver方法注册视频观测器。Java int ret = engine.registerVideoFrameObserver(iVideoFrameObserver); -
实现
onCaptureVideoFrame和onRenderVideoFrame回调。 获取视频数据后,你可以根据场景需要自行进行处理。注意
建议你在修改
videoFrame中的参数时,需确保修改后的参数跟视频帧缓冲区中的视频帧实际情况保持一致,否则可能导致本地预览画面和对端的视频画面出现非预期的旋转、失真等问题。Java private final IVideoFrameObserver iVideoFrameObserver = new IVideoFrameObserver() { @Override public boolean onCaptureVideoFrame(VideoFrame videoFrame) { Log.i(TAG, "OnEncodedVideoImageReceived"+Thread.currentThread().getName()); if(isSnapshot){ isSnapshot = false; // 获取图像 bitmap VideoFrame.Buffer buffer = videoFrame.getBuffer(); VideoFrame.I420Buffer i420Buffer = buffer.toI420(); int width = i420Buffer.getWidth(); int height = i420Buffer.getHeight(); ByteBuffer bufferY = i420Buffer.getDataY(); ByteBuffer bufferU = i420Buffer.getDataU(); ByteBuffer bufferV = i420Buffer.getDataV(); byte[] i420 = YUVUtils.toWrappedI420(bufferY, bufferU, bufferV, width, height); Bitmap bitmap = YUVUtils.NV21ToBitmap(getContext(), YUVUtils.I420ToNV21(i420, width, height), width, height); Matrix matrix = new Matrix(); matrix.setRotate(270); // 围绕原地进行旋转 Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false); // save to file saveBitmap2Gallery(newBitmap); bitmap.recycle(); i420Buffer.release(); } return false; } @Override public boolean onScreenCaptureVideoFrame(VideoFrame videoFrame) { return false; } @Override public boolean onMediaPlayerVideoFrame(VideoFrame videoFrame, int i) { return false; } @Override public boolean onRenderVideoFrame(String s, int i, VideoFrame videoFrame) { return false; } @Override public int getVideoFrameProcessMode() { return 0; } @Override public int getVideoFormatPreference() { return 1; } @Override public int getRotationApplied() { return 0; } @Override public boolean getMirrorApplied() { return false; } };
参考信息
示例项目
声网提供了开源的示例项目供你参考,你可以前往下载或查看其中的源代码。