使用Webrtc h264支持为Android构建Chromium

用户名

我正在尝试在webrtc中构建具有h264支持的Chromium Android。我的理解是以下args.gn文件应该可以执行我想要的操作。

target_os = "android"
target_cpu = "arm64"
proprietary_codecs = true
ffmpeg_branding = "Chrome"

但是,当我在Pixel 3上安装APK时,请使用chrome:// inspect从桌面调试并运行,new RTCPeerConnection().createOffer({offerToReceiveVideo: true}).then(s => console.log(s.sdp))我只会看到VP8和VP9编解码器。

还有什么我想念的吗?

用户名

我最终不得不更改代码以获得所需的行为。

设置这些构建标志会导致GPU进程对任何查询回答“是,我支持H264视频解码” https://cs.chromium.org/chromium/src/media/gpu/android/media_codec_video_decoder.cc?q=proprietary_codecs&sq =包装:铬&dr = C&l = 154

但是,webrtc对受支持编解码器的定义来自此功能,该功能只是轮询编码器支持的格式。https://webrtc.googlesource.com/src/+/refs/heads/master/media/engine/webrtc_video_engine.cc#142因此看来,尽管我的Pixel 3支持H264解码,但它不支持编码,因此webrtc认为它是不受支持的格式。有趣的是,在完全相同的设备上运行的Chrome确实支持webrtc H264。

我只希望接收H264视频,所以我编辑了此功能,以为Chrome支持的每种H264格式添加一个webrtc :: SdpVideoFormat。

+static void AddH264Formats(std::vector<webrtc::SdpVideoFormat>& formats) {
+  webrtc::SdpVideoFormat h264Format(kH264CodecName, {
+    {cricket::kH264FmtpLevelAsymmetryAllowed, "1"}});
+
+  h264Format.parameters[cricket::kH264FmtpProfileLevelId] = "42001f";
+  h264Format.parameters[cricket::kH264FmtpPacketizationMode] = "1";
+  if(std::find(formats.begin(), formats.end(), h264Format) == formats.end()) {
+    formats.push_back(h264Format);
+  }
+  h264Format.parameters[cricket::kH264FmtpPacketizationMode] = "0";
+  if(std::find(formats.begin(), formats.end(), h264Format) == formats.end()) {
+    formats.push_back(h264Format);
+  }
+
+  h264Format.parameters[cricket::kH264FmtpProfileLevelId] = "42e01f";
+  h264Format.parameters[cricket::kH264FmtpPacketizationMode] = "1";
+  if(std::find(formats.begin(), formats.end(), h264Format) == formats.end()) {
+    formats.push_back(h264Format);
+  }
+  h264Format.parameters[cricket::kH264FmtpPacketizationMode] = "0";
+  if(std::find(formats.begin(), formats.end(), h264Format) == formats.end()) {
+    formats.push_back(h264Format);
+  }
+
+  h264Format.parameters[cricket::kH264FmtpProfileLevelId] = "4d0032";
+  h264Format.parameters[cricket::kH264FmtpPacketizationMode] = "1";
+  if(std::find(formats.begin(), formats.end(), h264Format) == formats.end()) {
+    formats.push_back(h264Format);
+  }
+  h264Format.parameters[cricket::kH264FmtpPacketizationMode] = "0";
+  if(std::find(formats.begin(), formats.end(), h264Format) == formats.end()) {
+    formats.push_back(h264Format);
+  }
+}
+
 std::vector<VideoCodec> AssignPayloadTypesAndDefaultCodecs(
     const webrtc::VideoEncoderFactory* encoder_factory) {
-  return encoder_factory ? AssignPayloadTypesAndDefaultCodecs(
-                               encoder_factory->GetSupportedFormats())
-                         : std::vector<VideoCodec>();
+  auto formats = encoder_factory->GetSupportedFormats();
+  AddH264Formats(formats);
+
+  return AssignPayloadTypesAndDefaultCodecs(formats);
 }

我想可以编辑而不是编辑webrtc代码GpuVideoAcceleratorFactoriesImpl::GetVideoEncodeAcceleratorSupportedProfiles以这种方式编辑GpuVideoAcceleratorFactoriesImpl可能不太正确,但是它使我可以派生Chromium,而不必与第三方存储库混淆。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 OpenCV 构建 WebRTC

来自分类Dev

使用gstreamer将原始视频编码为h264

来自分类Dev

H264视频使用src属性工作。使用MediaSource API(Chromium)的同一视频失败

来自分类Dev

如何在Gradle构建中为S3支持的Maven存储库使用默认的AWS凭证链?

来自分类Dev

Google实施的WebRTC是否支持H.264

来自分类Dev

在Android WebRTC应用程序中使用DataChannel

来自分类Dev

使用webrtc或Peer to Peer进行视频通话IOS和android

来自分类Dev

使用FFmpeg使用Intel QuickSync将视频编码为h264

来自分类Dev

h264使用有哪些限制?

来自分类Dev

如何使用ffmpeg捕获h264

来自分类Dev

使用Wireshark将RTP有效负载解码为H264

来自分类Dev

使用h264流创建mkv容器时,数据无效,因为extradata为null

来自分类Dev

编码为H264使用ffmpeg C API无法发送某些帧

来自分类Dev

Webrtc Android DTMF支持

来自分类Dev

使用MediaCodec在Android上使用H264数据解码RTP流

来自分类Dev

64位支持使用vs-mda-remote构建Ipa

来自分类Dev

无法使用Python2支持构建OpenCV 3

来自分类Dev

使用32和64位支持库构建/安装llvm / clang

来自分类Dev

如何使用C ++ 14支持从源代码构建Qt 5

来自分类Dev

无法使用Python2支持构建OpenCV 3

来自分类Dev

在浏览器中播放几帧后,gstreamer webrtc h264播放停止

来自分类Dev

使用媒体基础在Windows上解码android h264编码的流

来自分类Dev

输入为Surface的Media Codec API无法与H264编码器一起使用(bigflake示例代码)

来自分类Dev

是否可以在不重新编码为RTMP端点的情况下使用相机的H264流?

来自分类Dev

WebRTC在代号One和AntMedia使用中的当前支持状态

来自分类Dev

使用 WebRtc 和本地点对点连接构建视频流应用程序?

来自分类Dev

如何在Android中使用API 7支持导航抽屉(所有功能)

来自分类Dev

使用NDK限制来响应本机和Android 7支持

来自分类Dev

使用FFMPEG编码与iOS兼容的h264音频流

Related 相关文章

  1. 1

    使用 OpenCV 构建 WebRTC

  2. 2

    使用gstreamer将原始视频编码为h264

  3. 3

    H264视频使用src属性工作。使用MediaSource API(Chromium)的同一视频失败

  4. 4

    如何在Gradle构建中为S3支持的Maven存储库使用默认的AWS凭证链?

  5. 5

    Google实施的WebRTC是否支持H.264

  6. 6

    在Android WebRTC应用程序中使用DataChannel

  7. 7

    使用webrtc或Peer to Peer进行视频通话IOS和android

  8. 8

    使用FFmpeg使用Intel QuickSync将视频编码为h264

  9. 9

    h264使用有哪些限制?

  10. 10

    如何使用ffmpeg捕获h264

  11. 11

    使用Wireshark将RTP有效负载解码为H264

  12. 12

    使用h264流创建mkv容器时,数据无效,因为extradata为null

  13. 13

    编码为H264使用ffmpeg C API无法发送某些帧

  14. 14

    Webrtc Android DTMF支持

  15. 15

    使用MediaCodec在Android上使用H264数据解码RTP流

  16. 16

    64位支持使用vs-mda-remote构建Ipa

  17. 17

    无法使用Python2支持构建OpenCV 3

  18. 18

    使用32和64位支持库构建/安装llvm / clang

  19. 19

    如何使用C ++ 14支持从源代码构建Qt 5

  20. 20

    无法使用Python2支持构建OpenCV 3

  21. 21

    在浏览器中播放几帧后,gstreamer webrtc h264播放停止

  22. 22

    使用媒体基础在Windows上解码android h264编码的流

  23. 23

    输入为Surface的Media Codec API无法与H264编码器一起使用(bigflake示例代码)

  24. 24

    是否可以在不重新编码为RTMP端点的情况下使用相机的H264流?

  25. 25

    WebRTC在代号One和AntMedia使用中的当前支持状态

  26. 26

    使用 WebRtc 和本地点对点连接构建视频流应用程序?

  27. 27

    如何在Android中使用API 7支持导航抽屉(所有功能)

  28. 28

    使用NDK限制来响应本机和Android 7支持

  29. 29

    使用FFMPEG编码与iOS兼容的h264音频流

热门标签

归档