安卓 webrtc 开启h264 软编解码
文章目录
- 安卓 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软编解码
网络搜索到的有很多复制、粘贴,缺少部分内容的,或者版本环境不匹配,很让人头疼。。。。
修改 ffmpeg_generated.gni 开启 openh264 编解码
安卓平台默认未支持 h264 解码,会显示黑屏
从third_party/ffmpeg/ffmpeg_generated.gni
中我们可以开到,默认未支持安卓平台
修改ffmpeg_generated.gni
中use_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当中增加 codec_list parser_list h264 支持
chromium/config/Chrome/android/arm64/config.h
中CONFIG_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"
增加文件 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();
}
- 增肌文件 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;}
}
- 增加 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
- 修改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();
- 修改
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",
- 修改 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<>()));}
- 编译使用吧,祝好运。。。
本文参考自 webrtc M75支持android安卓H264软编解遇到的一些坑
在其基础补充、完善部分说明和详细修改结果,如有问题欢迎反馈
一个已经编译好的aar如下,仅供参考
https://github.com/chenjim/mediasoup-client-android/releases
其它相关文档
安卓webrtc在ubuntu 2004下编译使用
https://blog.csdn.net/CSqingchen/article/details/120016697Android 断点调试 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 软编解码相关推荐
- Android技术分享| Android WebRTC 开启H264软件编解码教程
Android WebRTC 软件编解码基于 openH264 和 FFMpeg,但是编译时默认是不开启的,想要开启需要对代码做一定的增加修改,下面我将所有修改步骤一一列出. 本文基于 webRTC ...
- webrtc M66 华为手机h264硬编解码不支持问题
webrtc M66 华为手机h264硬编解码不支持问题 最近使用webrtc的h264编码时,测试发现华为都不支持,而其他手机可以,通过阅读webrtc的代码发现如下问题 webrtc 会先检测手机 ...
- ubuntu18.0.4编译ffmpeg开启qsv硬件编解码
文章目录 前言 正文 1. libmfx / iHD 路线 前置安装 编译安装ffmpeg 2. VAAPI / i965 路线 前言 参考官方文档:http://trac.ffmpeg.org/wi ...
- 雷霄骅--H264视频编解码分析--目录转载
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- 安卓webrtc在ubuntu 2004下编译使用
文章目录 安卓webrtc在ubuntu 2004下编译使用 相关网址链接 Http 全局代理配置 android webrtc 编译 boto 代理配置 Unable to reach the sn ...
- CrossWalk WebView添加支持WebRTC及H264编解码
前言 1.WebView简介 WebView是Android平台上的一个非常重要的系统组件,用于将一个显示浏览器页面的窗口嵌入到应用程序,并提供一组接口让开发者定制一些页面加载及JavaScript对 ...
- iOS8系统H264视频硬件编解码说明
iOS8系统H264视频硬件编解码说明 转载自:http://www.tallmantech.com/archives/206#more-206 公司项目原因,接触了一下视频流H264的编解码知识,之 ...
- iOS系统H264视频硬件编解码说明
公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...
- 硬件编解码,软件编解码,H.263、H.264、H.265/HEVC概念
概念 硬件编解码通常称为硬编码硬解码,软件编解码称为软编码软解码. 软编码软解码主要依赖的是CPU资源,设备普通使用也是使用CPU做计算,所以开始编解码视频的时候CPU会飙升起来,发热就无法避免. 硬 ...
- FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据
通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...
最新文章
- windows cmd 查看占用端口号PID并且结束进程
- C# Math类简介
- LetCode: 227. 简单计算器2
- SpringBoot整合Swagger 自动生成在线API文档 偷懒必备 同时也是我们的基本操作啦!!!
- C和指针之const、#define、volatile
- 通信模块开发 c语言,I2C通信模块c语言库文件
- Windows Mobile中的WebService应用
- 科大讯飞 开放平台 开发者 语音识别
- Arduino IDE搭建ESP8266开发环境!文件下载过慢解决方法!
- 设计模式之Builder模式(链式调用)
- matlab如何算排列组合数,MATLAB 排列组合问题
- 武汉市政府官网转载,长江日报、武汉电视台重磅报道,这场区块链大会厉害了!...
- mysql的存储过程,循环执行插入语句
- 【教程汇总】英文关键词发掘与整理
- Oracle实验 实验1 Oracle数据库安装与配置
- 使用python编写的落网电台下载工具
- 无线WIFI网络系统介绍
- 物联网这么火!物联网之下的物联网卡到底是什么样子?
- 用计算机测出人家的信息,NCAE 信息化办公模拟题 含答案
- LocalResolver国际化语言转换
热门文章
- 天馈系统驻波比概念,产生的原因,问题现象
- SHAP (SHapley Additive exPlanations)
- linux查看实时的日志命令,Linux实时查看日志的四种命令详解
- 51单片机实战教程基础硬件篇(三 51单片机开发板设计)
- 在VS2010中文版中配置OpenGL及问题解决
- 汇总|医学图像分析领域论文
- 如何用latex高效写毕业论文(超简明+实用经验分享)
- rs232接口_RS232接口与RS485究竟有什么区别?
- SolidWorks设计助手,可以标注和实体无关的工程图标注
- TestProject Python SDK入门