微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法为荣耀 7X 上的 H264 编码视频设置远程 SDP 报价

如何解决无法为荣耀 7X 上的 H264 编码视频设置远程 SDP 报价

我正在使用预构建包为 Android 开发 WebRTC 视频通话应用程序(单向视频和双向音频) org.webrtc:google-webrtc:1.0.32006。我被这个库中的一个错误所困扰:

LS_ERROR
tag: webrtc_video_engine.cc 
message: (line 745): No video codecs supported.

尝试设置远程 SDP 报价后:

v=0
o=- 955391267744368972 0 IN IP4 0.0.0.0
s=-
t=0 0
a=ice-options:trickle
a=group:BUNDLE video0 audio1 application2
m=video 9 UDP/TLS/RTP/SAVPF 96
c=IN IP4 0.0.0.0
a=setup:actpass
a=ice-ufrag:NwMv07hmtKD9s8EFikQCvqv7JvMpVhv4
a=ice-pwd:[xxx]
a=rtcp-mux
a=rtcp-rsize
a=sendrecv
a=rtpmap:96 H264/90000
a=rtcp-fb:96 nack pli
a=framerate:30
a=fmtp:96 packetization-mode=1;profile-level-id=42c01f;sprop-parameter-sets=J0LAH5WgKA9oQAAAAwBAAAAPOSAACYlgABqz+97gHiRNQA==,KM4fIA==
a=ssrc:2596331602 msid:user823769301@host-4c0ea8a4 webrtctransceiver0
a=ssrc:2596331602 cname:user823769301@host-4c0ea8a4
a=mid:video0
a=fingerprint:sha-256 [xxx]
m=audio 0 UDP/TLS/RTP/SAVPF 97
c=IN IP4 0.0.0.0
a=setup:actpass
a=ice-ufrag:NwMv07hmtKD9s8EFikQCvqv7JvMpVhv4
a=ice-pwd:[xxx]
a=bundle-only
a=rtcp-mux
a=rtcp-rsize
a=sendrecv
a=rtpmap:97 OPUS/48000/2
a=rtcp-fb:97 nack pli
a=fmtp:97 sprop-maxcapturerate=48000;sprop-stereo=0
a=ssrc:235675792 msid:user823769301@host-4c0ea8a4 webrtctransceiver1
a=ssrc:235675792 cname:user823769301@host-4c0ea8a4
a=mid:audio1
a=fingerprint:sha-256 [xxx]
m=application 0 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
a=setup:actpass
a=ice-ufrag:NwMv07hmtKD9s8EFikQCvqv7JvMpVhv4
a=ice-pwd:[xxx]
a=bundle-only
a=mid:application2
a=sctp-port:5000
a=fingerprint:sha-256 [xxx]

这让我很困惑,因为 android.media.MediaCodecList 包含 OMX.google.h264HardwareVideoDecoderFactory::supportedCodecs 包含 name: H264; params: {level-asymmetry-allowed=1,profile-level-id=42e01f,packetization-mode=1}

我使用的是华为设备 Honor 7X,我知道他们的芯片组缺少硬件 H264 编码,这很好,因为我不从 Android 设备流式传输任何视频

作为视频流设备,我使用带有 GStreamer 的 RaspBerryPi 构建作为媒体处理管道。 v4l2-ctl --list-formats输出

    Type: Video Capture

    [0]: 'YU12' (Planar YUV 4:2:0)
    [1]: 'YUYV' (YUYV 4:2:2)
    [2]: 'RGB3' (24-bit RGB 8-8-8)
    [3]: 'JPEG' (JFIF JPEG,compressed)
    [4]: 'H264' (H.264,compressed)
    [5]: 'MJPG' (Motion-JPEG,compressed)
    [6]: 'YVYU' (YVYU 4:2:2)
    [7]: 'VYUY' (VYUY 4:2:2)
    [8]: 'UYVY' (UYVY 4:2:2)
    [9]: 'NV12' (Y/CbCr 4:2:0)
    [10]: 'BGR3' (24-bit BGR 8-8-8)
    [11]: 'YV12' (Planar YVU 4:2:0)
    [12]: 'NV21' (Y/CrCb 4:2:0)
    [13]: 'RX24' (32-bit XBGR 8-8-8-8)

这是我的管道定义:

#define RTP_CAPS_OPUS "application/x-rtp,media=audio,encoding-name=OPUS,payload="
#define RTP_CAPS_H264 "application/x-rtp,media=video,encoding-name=H264,payload="

"v4l2src ! video/x-raw,width=640,height=480,framerate=30/1 ! v4l2h264enc ! video/x-h264,level=(string)3.1,stream-format=(string)byte-stream ! h264parse ! rtph264pay ! "  
        "" RTP_CAPS_H264 "96 ! sendrecv. "
        "alsasrc ! queue ! webrtcdsp noise-suppression-level=3 ! webrtcechoprobe ! audioamplify amplification=1 ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! "
        "queue ! " RTP_CAPS_OPUS "97 ! sendrecv. "

我的猜测是 H264 配置文件不同(RPi:42c01f;华为:42e01f)。格式负载的差异也可能在某种程度上(分别为 96100),但我对这些差异的重要性一无所知。

我的第二个猜测是,我不应该在两个客户端的视频媒体描述中都设置 a=sendrecv,但我不知道如何通过 WebRTC Android API 实现这一点。那么我应该为 RPi 设置 sendonly 吗?

最后,虽然我不编码任何视频,但为什么要设置 VideoEncoderFactory 事件?如果没有明确地将 DefaultVideoEncoderFactory 传递给 PeerConnection,我根本无法建立任何连接。

你能指出我正确的方向吗?非常感谢任何线索、经验和文档!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。