您好,我们需要获取视频的YUV源数据编辑以后再次传递给SDK,请问具体应该怎么操作呢?

在Android端,我们需要在主播端对YUV的源数据进行编辑,然后显示出来,包括推流到cdn以后也要能看到编辑后的内容,请问具体应怎么操作呢?找到了IAgoraMediaEngine.h这个文件,但是不知道下一步应该怎么做了。。。

你参考一下这篇修改视频原始数据的文档:https://docs.agora.io/cn/Video/rawdata_android?platform=Android#修改视频数据
示例代码:https://github.com/AgoraIO/Advanced-Interactive-Broadcasting/blob/master/Client-Side-AV-Capturing/Agora-client-side-AV-capturing-for-streaming-Android/README.zh.md

通过对应的接口处理好音视频裸数据后,再把数据回传给SDK就好了。

您好,我看过这个demo了 和您给的那个文档没有一点相关性啊,文档上说的 定义 AgoraVideoFrameObserver 继承 IVideoFrameObserver,我在demo上都没找到,您那边能给个详细点的吗?拜托了,感谢

demo里有呀

class AgoraVideoFrameObserver : public agora::media::IVideoFrameObserver
{
public:
    virtual bool onCaptureVideoFrame(VideoFrame& videoFrame) override
    {
        if (hasRemoteVideo) {
            // TODO picture composition
            // I420Rotate local
            // I420Rotate remote
            // I420Scale local and remote
        } else {
            int width = videoFrame.width;
            int height = videoFrame.height;

            I420Rotate((uint8_t*) videoFrame.yBuffer, videoFrame.yStride, (uint8_t*) videoFrame.uBuffer, videoFrame.uStride, (uint8_t*) videoFrame.vBuffer, videoFrame.vStride,
                                   localRotatedY, videoFrame.yStride, localRotatedU, videoFrame.uStride, localRotatedV, videoFrame.vStride,
                                   width, height, (RotationMode) videoFrame.rotation);

            VMUtil::instance().on_video_data(localRotatedY, localRotatedU, localRotatedV, width, height);
        }

        return true;
    }

    void save2YUVFile(const VideoFrame& videoFrame)
    {
        if (gFrame >= 55)
        {
            if (gpFile != NULL)
            {
                fclose(gpFile);
                gpFile = NULL;
            }
            return;
        }

        if (gpFile == NULL)
        {
            gpFile = fopen( "/sdcard/render.yuv" , "wb" );
        }
        if (gpFile != NULL)
        {
            __android_log_print( ANDROID_LOG_ERROR , "yuvdump" , "width:%d, height:%d", videoFrame.width, videoFrame.height);
            __android_log_print( ANDROID_LOG_ERROR , "yuvdump" , "yStride:%d, uStride:%d, vStride:%d", videoFrame.yStride, videoFrame.uStride, videoFrame.vStride);
            __android_log_print( ANDROID_LOG_ERROR , "yuvdump" , "dump yuv gFrame   %d" ,gFrame);

            for (int i = 0; i < videoFrame.height; i++)
            {
                fwrite((uint8_t*)videoFrame.yBuffer + videoFrame.yStride * i , videoFrame.width, 1 ,gpFile);
            }

            for (int i = 0; i < videoFrame.height/2; i++)
            {
                fwrite((uint8_t*)videoFrame.uBuffer + videoFrame.uStride * i , videoFrame.width/2, 1 ,gpFile);
            }

            for (int i = 0; i < videoFrame.height/2; i++)
            {
                fwrite((uint8_t*)videoFrame.vBuffer + videoFrame.vStride * i , videoFrame.width/2, 1 ,gpFile);
            }

            gFrame++;
        }
    }

    virtual bool onRenderVideoFrame(unsigned int uid, VideoFrame& videoFrame) override
    {
        if (remoteUid == -1 || remoteUid == uid) { // temporarily just use one remote stream;
            remoteFrame = videoFrame;
            remoteUid = uid;

            memcpy(remoteY, videoFrame.yBuffer, videoFrame.yStride * videoFrame.height);
            memcpy(remoteU, videoFrame.uBuffer, videoFrame.uStride * videoFrame.height / 2);
            memcpy(remoteV, videoFrame.vBuffer, videoFrame.vStride * videoFrame.height / 2);

            save2YUVFile(videoFrame);
        }

        hasRemoteVideo = true;

        return true;
    }
};

哦哦。。。我是想调用java的方法但是没找到,这样还是不知道应该怎么去处理。。感谢~

好的:joy:Agora 原始数据接口是一个 C++ 接口,你需要在 Android 上使用 SDK 库的 JNI 和插件管理器的。

您好,我想再问一下,我现在把数据传到java以后,对yuv编辑过了,需要再次调用什么方法把这个编辑后数据传给sdk啊?

你看下这一个demo吧:https://github.com/AgoraIO/Advanced-Video/blob/master/Capture-Raw-Video-Data/Agora-Plugin-Raw-Data-API-Android-Java/README.zh.md
这个demo里,java和c++是公用一块内存的,java改变哪块内存,C++那边也会跟着改变。

是这样的,我在您第一个链接 https://github.com/AgoraIO/Advanced-Interactive-Broadcasting/blob/master/Client-Side-AV-Capturing/Agora-client-side-AV-capturing-for-streaming-Android/README.zh.md 的StubStreamingClient.class的sendYUVData()方法中拿到了yuv的数据,对其编辑以后,在视频画面上并没有显示出编辑后的效果来,我直接用的这个demo编辑的。

对的,第一个链接的 demo 只实现了把数据回传到 Java 代码层,没有传回 SDK,需要你自己传回去。
前面发给你的第二个链接,你改 JAVA 代码,C++ 那儿也会对应地更改,就可以直接把修改的数据传回 SDK 了。

您好,我用了您第二个链接的demo,调试没问题,但是我把demo的moudle引入到我们的项目中就会崩溃会报一个 UnsatisfiedLinkError couldn’t find “libapm-plugin-raw-data-api-java.so” 您能帮我看看是大概哪些地方有遗漏吗?


你看下有没有导入这些so文件?

我在主项目下加了
ndk {
abiFilters “armeabi-v7a”
}
编译通过了,但是没发现您框起来的这个so文件。。。在demo中也没发现~

image
在这个路径下呀

解决了,非常感谢~辛苦辛苦~~~

不客气:+1:

how to get "libapm-plugin-raw-data- api-java.so " this file .same error was come in 32 bit devices please help me