我正在创建一个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(),但它也卡住了。
暂无答案!
目前还没有任何答案,快来回答吧!