问题描述
我正在尝试创建一个概念证明(使用适用于 Android 的 WebRTC SDK),它接收视频流并对其进行解码 (H264),将其呈现在 SurfaceVieWrenderer 上,然后对其进行编码(也使用 H264)并将其发回到服务器。为了实现它,我创建了两个 PeerConnectionClient 实例,一个负责接收和解码(我们称之为 A),第二个用于编码和发送 (B)。接收器实例 (A) 分配了两个 Videosink:一个是 SurfaceVieWrenderer(用于显示内容),第二个是自定义 VideoCapturer 实例,它将从实例 B 接收到的 VideoFrame 发送到 CaptureObserver,如下所示:
@Override
public void onFrame(VideoFrame frame) {
synchronized (stateLock) {
capturerObserver.onFrameCaptured(frame);
}
}
这应该基本上调用编码和发送过程。但是,编码器不断失败,错误代码为 -13:
I/rtp_video_stream_receiver.cc: (line 604): OnCompleteFrame
I/video_receive_stream.cc: (line 546): ----OnCompleteFrame----
I/AndroidVideoDecoder: Capture time Ms: 41802432 system time: 1612362036854
E/video_stream_encoder.cc: (line 1556): Failed to encode frame. Error code: -13
D/STH: Set Texture Size
I/rtp_video_stream_receiver.cc: (line 537): On assemble frame
I/rtp_frame_reference_finder.cc: (line 688): tid = 0
(line 764): handoff tid == 0
(line 59): Frame decision kHandOff
我尝试了各种不同的解决方案,但只有在将 TextureBuffer 转换为 I420 字节数组时才能正确编码和发送视频,然后再发送:
synchronized (stateLock)
{
final long captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
VideoFrame clonedFrame = new VideoFrame(frame.getBuffer().toI420(),captureTimeNs);
capturerObserver.onFrameCaptured(clonedFrame);
clonedFrame.release();
}
因此,我认为这个问题可能与编码器和解码器之间共享纹理有关,它们在不同的线程上工作并使用自己的 EGLContexts。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)