本文介绍如何对采集到的原始视频数据进行前处理和后处理。
视频传输过程中,你可以对采集到的视频数据进行前处理和后处理,获取想要的播放效果。
对于有自行处理视频数据需求的场景,声网提供原始数据功能。你可以在将数据发送给编码器前进行前处理,对捕捉到的视频帧进行修改;也可以在将数据发送给解码器后进行后处理,对接收到的视频帧进行修改。
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。有关详细信息,请参考实现视频通话或实现视频直播。
参考如下步骤,在你的项目中实现原始视频数据功能:
加入频道前,创建一个 IVideoFrameObserver
对象,并调用 registerVideoFrameObserver
方法注册视频观测器。
int ret = engine.registerVideoFrameObserver(iVideoFrameObserver);
实现 onCaptureVideoFrame
,onRenderVideoFrame
和 onScreenCaptureVideoFrame
回调。 获取视频数据后,你可以根据场景需要自行进行处理。
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;
}
};
本节介绍本文中使用方法的更多信息以及相关页面的链接。
声网在 GitHub 上提供一个开源的原始视频数据示例项目。