原始视频数据

  • Android

更新时间不可用

了解实时互动 RTC 在不同平台上的原始视频数据方式,包括接入流程、关键配置和平台差异。

技术原理

本文介绍如何对采集到的原始视频数据进行前处理和后处理。视频传输过程中,你可以对采集到的视频数据进行前处理和后处理,获取想要的播放效果。

对于有自行处理视频数据需求的场景,声网提供原始数据功能。你可以在将数据发送给编码器前进行前处理,对捕捉到的视频帧进行修改;也可以在将数据发送给解码器后进行后处理,对接收到的视频帧进行修改。

前提条件

在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。详见实现音视频互动。

实现方法

参考如下步骤,在你的项目中实现原始视频数据功能:

  1. 加入频道前,创建一个 IVideoFrameObserver 对象,并调用 registerVideoFrameObserver 方法注册视频观测器。

    Java
     int ret = engine.registerVideoFrameObserver(iVideoFrameObserver);
  2. 实现 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;
     }
    };

参考信息

示例项目

声网提供了开源的示例项目供你参考,你可以前往下载或查看其中的源代码。

API 参考