如何正确覆盖android版webrtc sdk中videosink的onframe?

57hvy0tb  于 2021-07-07  发布在  Java
关注(0)|答案(0)|浏览(389)

我正在创建一个android应用程序,它使用webrtcsdk for android,即最新版本1.0.32006。
我需要一种方法来创建两个,本地视频跟踪和远程视频跟踪延迟。

我的方法

我扩展了surfaceviewrender并重写了它的onframe(视频帧)功能。它将帧放入队列中,当时间正确时,它将peek帧传递给父类。正如源代码的注解所示,我在传入帧上调用retain(),在不再需要该帧时调用release()。
这种方法可以很好地与本地跟踪-视频渲染正确的延迟。
这种方法不适合远程跟踪,我看不出原因。如果我调用retain(),onframe将只为第一个帧调用,并且不再被调用。如果我不调用retain(),应用程序将崩溃,并出现错误:retain()在引用计数小于1的缓冲区上调用(这是合理的错误)。

代码

public class DelayedViewRenderer extends SurfaceViewRenderer {

    ...

    @Override
    public void onFrame(VideoFrame videoFrame) {
        videoFrame.retain();

        VideoFrame nextFrame = _framesQueue.peek();
        if (nextFrame != null) {
            long diffMillis = (videoFrame.getTimestampNs() - nextFrame.getTimestampNs()) / 1000000;
            if (diffMillis >= _delayMillis) {
                nextFrame = _framesQueue.poll();
                super.onFrame(nextFrame);
                nextFrame.release();
            }
        }

        _framesQueue.add(videoFrame);
    }
}

到目前为止我试过的

首先,如果我直接使用surfaceviewrender,一切都会变得很好。
我尝试添加另一个视频接收器到远程跟踪,看看它的onframe是否会被调用,但他们都卡住了。
我尝试渲染第一帧,并在第二帧上调用retain(),但它也卡住了。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题