文章目录

  • 安卓 webrtc 开启h264 软编解码

安卓 webrtc 开启h264 软编解码

本文首发地址 https://blog.csdn.net/CSqingchen/article/details/120199702
最新更新地址 https://gitee.com/chenjim/chenjimblog
本文基于libmediasoupclient 3.2.0 和 webrtc branch-heads/4147(m84)
本文得熟悉相关基础,参考 文1 和 文2
除了需要加编译参数 rtc_use_h264=true, 还需要以下修改以支持h264软编解码
网络搜索到的有很多复制、粘贴,缺少部分内容的,或者版本环境不匹配,很让人头疼。。。。

  1. 修改 ffmpeg_generated.gni 开启 openh264 编解码
    安卓平台默认未支持 h264 解码,会显示黑屏
    third_party/ffmpeg/ffmpeg_generated.gni 中我们可以开到,默认未支持安卓平台
    修改 ffmpeg_generated.gniuse_linux_config,添加 || is_android以支持,结果如下
    use_linux_config = is_linux || is_fuchsia || is_android
    参考自 https://www.codeleading.com/article/3215969775
    而对于软编解码,android webrtc采用openh264 +ffmpeg,这两块的代码都在webrtc源码src/third_party当中

  2. 增加 codec_list parser_list h264 支持
    chromium/config/Chrome/android/arm64/config.hCONFIG_H264_DECODER 设置为 1
    third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/parser_list.c 中添加 &ff_h264_parser,
    third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/codec_list.c 中添加 &ff_h264_decoder,
    third_party/ffmpeg/chromium/config/下有 Chrome ChromeOS Chromium,这里用的是 Chrome,(其它可能有问题。。。)
    需要在编译参数添加 ffmpeg_branding="Chrome"
    这里路径 android/arm64 是需要配合参数 --arch "arm64-v8a",
    如果是 armeabi-v7a 需要同步修改目录下 arm-neon,最终编译参数参考:
    ./tools_webrtc/android/build_aar.py --extra-gn-args 'rtc_use_h264=true ffmpeg_branding="Chrome" rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false' --arch "arm64-v8a"

  3. 增加文件 LibH264Decoder.java
    复制 sdk/android/api/org/webrtc/LibvpxVp8Decoder.java为同目录 LibH264Decoder.java,修改后如下:

package org.webrtc;
public class LibH264Decoder extends WrappedNativeVideoDecoder {@Overridepublic long createNativeVideoDecoder() {return nativeCreateDecoder();}static native long nativeCreateDecoder();
}
  1. 增肌文件 LibH264Encoder.java
    复制 sdk/android/api/org/webrtc/LibvpxVp8Encoder.java 为同目录 LibH264Encoder.java,修改后如下:
package org.webrtc;
public class LibH264Encoder extends WrappedNativeVideoEncoder {@Overridepublic long createNativeVideoEncoder() {return nativeCreateEncoder();}static native long nativeCreateEncoder();@Overridepublic boolean isHardwareEncoder() {return false;}
}
  1. 增加 h264_codec.cc
    复制 sdk/android/src/jni/vp8_codec.cc 为同目录 h264_codec.cc,修改后如下:
#include <jni.h>
#include "modules/video_coding/codecs/h264/include/h264.h"
#include "sdk/android/generated_libH264_jni/LibH264Decoder_jni.h"
#include "sdk/android/generated_libH264_jni/LibH264Encoder_jni.h"
#include "sdk/android/src/jni/jni_helpers.h"
namespace webrtc {namespace jni {static jlong JNI_LibH264Encoder_CreateEncoder(JNIEnv* jni) {return jlongFromPointer(H264Encoder::Create().release());
}
static jlong JNI_LibH264Decoder_CreateDecoder(JNIEnv* jni) {return jlongFromPointer(H264Decoder::Create().release());
}
}  // namespace jni
}  // namespace webrtc
  1. 修改H264 Create()
    添加上面要用到的 H264Encoder::Create(),修改 diff 如下:
--- a/modules/video_coding/codecs/h264/h264.cc
+++ b/modules/video_coding/codecs/h264/h264.cc
@@ -84,6 +84,16 @@ std::vector<SdpVideoFormat> SupportedH264Codecs() {"0")};}+ std::unique_ptr<H264Encoder> H264Encoder::Create() {
+ #if defined(WEBRTC_USE_H264)
+  RTC_LOG(LS_INFO) << "Creating H264EncoderImpl.";
+  return std::make_unique<H264EncoderImpl>(cricket::VideoCodec("H264"));
+ #else
+      RTC_NOTREACHED();
+      return nullptr;
+ #endif
+    }
+std::unique_ptr<H264Encoder> H264Encoder::Create(const cricket::VideoCodec& codec) {RTC_DCHECK(H264Encoder::IsSupported());--- a/modules/video_coding/codecs/h264/include/h264.h
+++ b/modules/video_coding/codecs/h264/include/h264.h
@@ -43,6 +43,7 @@ std::vector<SdpVideoFormat> SupportedH264Codecs();class RTC_EXPORT H264Encoder : public VideoEncoder {public:
+  static std::unique_ptr<H264Encoder> Create();static std::unique_ptr<H264Encoder> Create(const cricket::VideoCodec& codec);// If H.264 is supported (any implementation).static bool IsSupported();
  1. 修改 sdk/android/BUILD.gn
    将其中 vp8 相关地方复制添加 h264 相关,我的一份修改 diff 如下,若编译有问题或者无效,需仔细核对此处。。。
@@ -45,6 +45,7 @@ if (is_android) {":java_audio_device_module_java",":libjingle_peerconnection_java",":libjingle_peerconnection_metrics_default_java",
+      ":libH264_java",":libvpx_vp8_java",":libvpx_vp9_java",":logging_java",
@@ -489,6 +490,20 @@ if (is_android) {]}+  rtc_android_library("libH264_java") {
+    visibility = [ "*" ]
+    sources = [
+      "api/org/webrtc/LibH264Decoder.java",
+      "api/org/webrtc/LibH264Encoder.java",
+    ]
+    deps = [
+      ":base_java",
+      ":video_api_java",
+      ":video_java",
+      "//rtc_base:base_java",
+    ]
+  }
+rtc_android_library("libvpx_vp9_java") {visibility = [ "*" ]sources = [
@@ -512,6 +527,7 @@ if (is_android) {deps = [":base_java",
+      ":libH264_java",":libvpx_vp8_java",":libvpx_vp9_java",":video_api_java",
@@ -783,6 +799,18 @@ if (current_os == "linux" || is_android) {]}+ rtc_library("libH264_jni") {
+    visibility = [ "*" ]
+    allow_poison = [ "software_video_codecs" ]
+    sources = [ "src/jni/h264_codec.cc" ]
+    deps = [
+      ":base_jni",
+      ":generated_libH264_jni",
+      ":video_jni",
+      "../../modules/video_coding:webrtc_h264",
+    ]
+  }
+rtc_library("libvpx_vp9_jni") {visibility = [ "*" ]allow_poison = [ "software_video_codecs" ]
@@ -799,6 +827,7 @@ if (current_os == "linux" || is_android) {visibility = [ "*" ]allow_poison = [ "software_video_codecs" ]deps = [
+      ":libH264_jni",":libvpx_vp8_jni",":libvpx_vp9_jni",]
@@ -1203,6 +1232,16 @@ if (current_os == "linux" || is_android) {jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"}+  generate_jni("generated_libH264_jni") {
+    sources = [
+      "api/org/webrtc/LibH264Decoder.java",
+      "api/org/webrtc/LibH264Encoder.java",
+    ]
+
+    namespace = "webrtc::jni"
+    jni_generator_include = "//sdk/android/src/jni/jni_generator_helper.h"
+  }
+generate_jni("generated_libvpx_vp9_jni") {sources = ["api/org/webrtc/LibvpxVp9Decoder.java",
  1. 修改 SoftwareVideoDecoderFacoty.java 和 SoftwareVideoEncoderFacoty.java
    需要 分别注册 H.264 并添加创建 codec 的代码, 我的修改 DIFF 如下
--- a/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java
+++ b/sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java
@@ -26,6 +26,10 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory {@Nullable@Overridepublic VideoDecoder createDecoder(VideoCodecInfo codecType) {
+    if (codecType.getName().equalsIgnoreCase("H264")) {
+      return new LibH264Decoder();
+    }
+if (codecType.getName().equalsIgnoreCase("VP8")) {return new LibvpxVp8Decoder();}
@@ -45,6 +49,9 @@ public class SoftwareVideoDecoderFactory implements VideoDecoderFactory {List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();codecs.add(new VideoCodecInfo("VP8", new HashMap<>()));
+
+    codecs.add(new VideoCodecInfo("H264", new HashMap<>()));
+if (LibvpxVp9Decoder.nativeIsSupported()) {codecs.add(new VideoCodecInfo("VP9", new HashMap<>()));}--- a/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java
+++ b/sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java
@@ -19,6 +19,9 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {@Nullable@Overridepublic VideoEncoder createEncoder(VideoCodecInfo info) {
+    if (info.name.equalsIgnoreCase("H264")) {
+      return new LibH264Encoder();
+    }if (info.name.equalsIgnoreCase("VP8")) {return new LibvpxVp8Encoder();}
@@ -38,6 +41,9 @@ public class SoftwareVideoEncoderFactory implements VideoEncoderFactory {List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();codecs.add(new VideoCodecInfo("VP8", new HashMap<>()));
+
+    codecs.add(new VideoCodecInfo("H264", new HashMap<>()));
+if (LibvpxVp9Encoder.nativeIsSupported()) {codecs.add(new VideoCodecInfo("VP9", new HashMap<>()));}
  1. 编译使用吧,祝好运。。。

本文参考自 webrtc M75支持android安卓H264软编解遇到的一些坑
在其基础补充、完善部分说明和详细修改结果,如有问题欢迎反馈


一个已经编译好的aar如下,仅供参考
https://github.com/chenjim/mediasoup-client-android/releases


其它相关文档

  • 安卓webrtc在ubuntu 2004下编译使用
    https://blog.csdn.net/CSqingchen/article/details/120016697

  • Android 断点调试 webrtc、 medieasoup
    https://blog.csdn.net/CSqingchen/article/details/120156900

  • 安卓增加 mediasoup webrtc 日志输出
    https://blog.csdn.net/CSqingchen/article/details/120156669

  • 安卓 Mediasoup V3 基于webrtc 分支m84 的编译
    https://blog.csdn.net/CSqingchen/article/details/120163087

  • 安卓 webrtc 开启h264 软编解码
    https://blog.csdn.net/CSqingchen/article/details/120199702

  • 安卓mediasoup输出H264流(支持H264编码)
    https://blog.csdn.net/CSqingchen/article/details/120218832

  • 安卓mediasoup webrtc h264 软编解码相关源码分析
    https://blog.csdn.net/CSqingchen/article/details/120218923

安卓 webrtc 开启h264 软编解码相关推荐

  1. Android技术分享| Android WebRTC 开启H264软件编解码教程

    Android WebRTC 软件编解码基于 openH264 和 FFMpeg,但是编译时默认是不开启的,想要开启需要对代码做一定的增加修改,下面我将所有修改步骤一一列出. 本文基于 webRTC ...

  2. webrtc M66 华为手机h264硬编解码不支持问题

    webrtc M66 华为手机h264硬编解码不支持问题 最近使用webrtc的h264编码时,测试发现华为都不支持,而其他手机可以,通过阅读webrtc的代码发现如下问题 webrtc 会先检测手机 ...

  3. ubuntu18.0.4编译ffmpeg开启qsv硬件编解码

    文章目录 前言 正文 1. libmfx / iHD 路线 前置安装 编译安装ffmpeg 2. VAAPI / i965 路线 前言 参考官方文档:http://trac.ffmpeg.org/wi ...

  4. 雷霄骅--H264视频编解码分析--目录转载

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  5. 安卓webrtc在ubuntu 2004下编译使用

    文章目录 安卓webrtc在ubuntu 2004下编译使用 相关网址链接 Http 全局代理配置 android webrtc 编译 boto 代理配置 Unable to reach the sn ...

  6. CrossWalk WebView添加支持WebRTC及H264编解码

    前言 1.WebView简介 WebView是Android平台上的一个非常重要的系统组件,用于将一个显示浏览器页面的窗口嵌入到应用程序,并提供一组接口让开发者定制一些页面加载及JavaScript对 ...

  7. iOS8系统H264视频硬件编解码说明

    iOS8系统H264视频硬件编解码说明 转载自:http://www.tallmantech.com/archives/206#more-206 公司项目原因,接触了一下视频流H264的编解码知识,之 ...

  8. iOS系统H264视频硬件编解码说明

    公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...

  9. 硬件编解码,软件编解码,H.263、H.264、H.265/HEVC概念

    概念 硬件编解码通常称为硬编码硬解码,软件编解码称为软编码软解码. 软编码软解码主要依赖的是CPU资源,设备普通使用也是使用CPU做计算,所以开始编解码视频的时候CPU会飙升起来,发热就无法避免. 硬 ...

  10. FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据

    通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...

最新文章

  1. windows cmd 查看占用端口号PID并且结束进程
  2. C# Math类简介
  3. LetCode: 227. 简单计算器2
  4. SpringBoot整合Swagger 自动生成在线API文档 偷懒必备 同时也是我们的基本操作啦!!!
  5. C和指针之const、#define、volatile
  6. 通信模块开发 c语言,I2C通信模块c语言库文件
  7. Windows Mobile中的WebService应用
  8. 科大讯飞 开放平台 开发者 语音识别
  9. Arduino IDE搭建ESP8266开发环境!文件下载过慢解决方法!
  10. 设计模式之Builder模式(链式调用)
  11. matlab如何算排列组合数,MATLAB 排列组合问题
  12. 武汉市政府官网转载,长江日报、武汉电视台重磅报道,这场区块链大会厉害了!...
  13. mysql的存储过程,循环执行插入语句
  14. 【教程汇总】英文关键词发掘与整理
  15. Oracle实验 实验1 Oracle数据库安装与配置
  16. 使用python编写的落网电台下载工具
  17. 无线WIFI网络系统介绍
  18. 物联网这么火!物联网之下的物联网卡到底是什么样子?
  19. 用计算机测出人家的信息,NCAE 信息化办公模拟题 含答案
  20. LocalResolver国际化语言转换

热门文章

  1. 天馈系统驻波比概念,产生的原因,问题现象
  2. SHAP (SHapley Additive exPlanations)
  3. linux查看实时的日志命令,Linux实时查看日志的四种命令详解
  4. 51单片机实战教程基础硬件篇(三 51单片机开发板设计)
  5. 在VS2010中文版中配置OpenGL及问题解决
  6. 汇总|医学图像分析领域论文
  7. 如何用latex高效写毕业论文(超简明+实用经验分享)
  8. rs232接口_RS232接口与RS485究竟有什么区别?
  9. SolidWorks设计助手,可以标注和实体无关的工程图标注
  10. TestProject Python SDK入门