保存yuv文件


#1

视频通话中怎么保存对方的视频YUV文件?


#2

保存对方的视频YUV文件?你那边是要做什么吗?
可以通过裸数据接口onRenderVideoFrame拿到对端原始视频流数据:https://docs.agora.io/cn/Voice/rawdata_windows?platform=Windows#修改视频数据
https://docs.agora.io/cn/Voice/API%20Reference/cpp/classagora_1_1media_1_1_i_video_frame_observer.html#a966ed2459b6887c52112af638bc27c14


#3

virtual bool onCaptureVideoFrame(VideoFrame& videoFrame) override
{
char msg[256];
sprintf_s(msg, 256, “%s: width=%d, height=%d\n”, FUNCTION, videoFrame.width, videoFrame.height);
LogMessage(msg);

int width = videoFrame.width;
int height = videoFrame.height;

s_file_capture.Write(videoFrame.yBuffer, width * height);
s_file_capture.Write(videoFrame.uBuffer, width * height / 4);
s_file_capture.Write(videoFrame.vBuffer, width * height / 4);

memset(videoFrame.uBuffer, 128, videoFrame.uStride*height / 2);
memset(videoFrame.vBuffer, 128, videoFrame.vStride*height / 2);
return true;

}

我把yuv数据保存到yuv文件后使用工具打开,出现花屏
请问是怎么回事?


#4

onRenderVideoFrame方法拿到的视频数据格式为 YUV420。缓冲区给出的是指向指针的指针,但不能修改缓冲区的指针,只能修改缓冲区的内容。
所以你那边具体的业务场景是啥?


#5

virtual bool onCaptureVideoFrame(VideoFrame& videoFrame) override
{
char msg[256];
sprintf_s(msg, 256, “%s: width=%d, height=%d\n”, FUNCTION, videoFrame.width, videoFrame.height);
LogMessage(msg);

int width = videoFrame.width;
int height = videoFrame.height;

// s_file_capture.Write(videoFrame.yBuffer, width * height);
// s_file_capture.Write(videoFrame.vBuffer, width * height / 4);
// s_file_capture.Write(videoFrame.uBuffer, width * height / 4);
s_file_capture.Write(videoFrame.yBuffer, videoFrame.yStride * height);
s_file_capture.Write(videoFrame.uBuffer, videoFrame.uStride * height / 2);
s_file_capture.Write(videoFrame.vBuffer, videoFrame.vStride * height / 2);

// memset(videoFrame.uBuffer, 128, videoFrame.uStride*height / 2);
// memset(videoFrame.vBuffer, 128, videoFrame.vStride*height / 2);
return true;

}

我想把每一帧的数据保存到本地yuv文件中,然后使用工具打开能还原我采集到的视频


#6

实际情况是视频能还原但是色彩不对并出现条纹


#7

需要保存的视频数据是哪个端发出的?windows还是ios还是android?

1.windows端发送,使用onCaptureVideoFrame裸数据回调函数。
(1)确认videoFramewidthheight,与setVideoProfile设置的分辨率是否相等。不相等说明registerVideoFrameObserversetVideoprofile之前了。改为之后即可。
以及,是否使用了SetVideoProfileEx来设置了高比宽大的分辨率?
(2)确认videoFrameystirdewidth是否相等,宽高与setVideoProfile的分辨率相同,ystride 不等于width。一般发生这种情况主要是,setVideoProfileEx里指定了任意的分辨率,使得宽不是16的整数倍。

2.windows 端获取手机的视频出现花屏情况:
onRenderVideoFramewidth不等于ystride。需要把每一行右侧多出来ystride-width的数据裁剪掉。

3.你存了几个uid的数据?如果自己根据不同的uid缓存videoFrame的数据,保存为本地文件,保存的文件有两个uid的视频出现时,有可能是保存buffer的逻辑出现了问题。
建议保存yuv420数据时,直接写videoFrame.yBufferuBuffervBuffer,使得一个uid对应一个文件。