webrtc-m79-msvc编译H264

这篇具有很好参考价值的文章主要介绍了webrtc-m79-msvc编译H264。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 写在前面

本文主要参考:webrtc 4577版本vs编译_tusong86的博客-CSDN博客

4577也就是m93,由于源码版本的不同,可能存在一定的出入,可根据实际情况进行修改;

感谢作者的付出;

1 编译参数

powershell运行:

// debug 需要编译参数 enable_iterator_debugging=true

gn gen h264-debug-m79 --args='is_debug=true use_lld=false is_clang=false treat_warnings_as_errors=false use_custom_libcxx=false is_component_build=false use_rtti=true rtc_enable_protobuf=false rtc_build_examples=true enable_iterator_debugging=true rtc_use_h264=true use_openh264=true ffmpeg_branding=\"Chrome\" proprietary_codecs=true' --ide=vs2019

查看参数是否生效:

gn args h264-debug-m79 --list=rtc_use_h264

gn args h264-debug-m79 --list=use_openh264

//release 不需要编译参数 enable_iterator_debugging=true

gn gen h264-release-m79 --args='is_debug=false use_lld=false is_clang=false treat_warnings_as_errors=false use_custom_libcxx=false is_component_build=false use_rtti=true rtc_enable_protobuf=false rtc_build_examples=true rtc_use_h264=true use_openh264=true ffmpeg_branding=\"Chrome\" proprietary_codecs=true' --ide=vs2019

查看参数是否生效:

gn args h264-release-m79 --list=rtc_use_h264

gn args h264-release-m79 --list=use_openh264

为了避免下面2.3小节的问题,需要将webrtc的编译参数修改为MD(d),具体修改如下所示:

webrtc-m79-msvc编译H264,webrtc,webrtc

2 编译错误以及修复

2.1 错误一

webrtc-m79-msvc编译H264,webrtc,webrtc

解决方案:

注释掉代码:

See: bugs.webrtc.org/9213#c13

具体修改如下图:

webrtc-m79-msvc编译H264,webrtc,webrtc

2.2 错误二

webrtc-m79-msvc编译H264,webrtc,webrtc

解决方案:

注释掉\third_party\ffmpeg\libavcodec\pcm.c的最后一行,具体如下图:

webrtc-m79-msvc编译H264,webrtc,webrtc

2.3 错误三

2.3.1 问题描述

webrtc-m79-msvc编译H264,webrtc,webrtc

解决此问题需要使用自己MSVC编译的x64 ffmpeg动态库,如何编译ffmpeg的动态库可以采用参考链接[2],自己在尝试的过程中遇到了一些问题:

(1)在编译ffmpeg时采用MT(d)进行编译时出现了很多问题,所以编译ffmpeg还是使用MD(d)方式,但是呢webrtc默认编译的是MT(d),所以需要将webrtc修改为MD(d),修改方式具体见前面;

(2)在使用ffmpeg_deps.sln生成库时,务必选择编译动态库,在使用ffmpeg静态库时则会出现符号重定义的问题,具体如下:

webrtc-m79-msvc编译H264,webrtc,webrtc

原因就是webrtc所依赖的第三方库中也使用了libvp8(highbd_variance_sse2.obj),而ffmpeg的静态库libavcodec.lib中也包含了highbd_variance_sse2.obj的定义,因此出现了冲突,论据如下:

webrtc-m79-msvc编译H264,webrtc,webrtc

webrtc中的证据:

webrtc-m79-msvc编译H264,webrtc,webrtc

2.3.2 解决步骤

假设已经准备好了ffmpeg的动态库,后续的步骤主要如下:

2.3.2.1 拷贝文件

将ffmpeg_deps.sln生成的如下图中的文件拷贝到webrtc的指定目录,具体如下:

D:\webrtc-checkout\src\third_party\ffmpeg_smp_release_x64目录是新创建的,为的就是与之前的ffmpeg区别开来;

拷贝动态库文件

webrtc-m79-msvc编译H264,webrtc,webrtc

拷贝头文件

webrtc-m79-msvc编译H264,webrtc,webrtc

2.3.2.2 修改gn文件

修改D:\webrtc-checkout\src\modules\video_coding\BUILD.gn文件

webrtc-m79-msvc编译H264,webrtc,webrtc

修改内容罗列如下:

rtc_static_library("webrtc_h264") {
  visibility = [ "*" ]
  sources = [
    "codecs/h264/h264.cc",
    "codecs/h264/h264_color_space.cc",
    "codecs/h264/h264_color_space.h",
    "codecs/h264/h264_decoder_impl.cc",
    "codecs/h264/h264_decoder_impl.h",
    "codecs/h264/h264_encoder_impl.cc",
    "codecs/h264/h264_encoder_impl.h",
    "codecs/h264/include/h264.h",
  ]

  if (!is_clang) {
  #设置头文件路径
    include_dirs = [ "//third_party/ffmpeg_smp_release_x64/include" ]
    libs = [
   # 设置引用库
       "//third_party/ffmpeg_smp_release_x64/bin/avcodec.lib",
       "//third_party/ffmpeg_smp_release_x64/bin/avdevice.lib",
       "//third_party/ffmpeg_smp_release_x64/bin/avfilter.lib",
       "//third_party/ffmpeg_smp_release_x64/bin/avformat.lib",
       "//third_party/ffmpeg_smp_release_x64/bin/avutil.lib",
       "//third_party/ffmpeg_smp_release_x64/bin/swresample.lib",
       "//third_party/ffmpeg_smp_release_x64/bin/swscale.lib",
    ]
  }

  defines = []
  deps = [
    ":video_codec_interface",
    ":video_coding_utility",
    "../../api/video:video_frame",
    "../../api/video:video_frame_i010",
    "../../api/video:video_frame_i420",
    "../../api/video:video_rtp_headers",
    "../../api/video_codecs:video_codecs_api",
    "../../common_video",
    "../../media:rtc_h264_profile_id",
    "../../media:rtc_media_base",
    "../../rtc_base",
    "../../rtc_base:checks",
    "../../rtc_base/system:rtc_export",
    "../../system_wrappers:field_trial",
    "../../system_wrappers:metrics",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/types:optional",
    "//third_party/libyuv",
  ]

  if (rtc_use_h264) {
    deps += [
      #"//third_party/ffmpeg",
      "//third_party/openh264:encoder",
    ]
    if (!build_with_mozilla) {
      deps += [ "../../media:rtc_media_base" ]
    }
  }
}

截止到这里虽然可以编译成功了,但是还有其他的问题,虽然这里替换成了自己编译的ffmpeg的x64动态库,但是webrtc的代码中所引用的头文件还是之前的ffmpeg的路径,如果不修改在运行的时候就会出现崩溃,所以还需要修改源码,具体见2.3.2.3小节;

2.3.2.3 修改webrtc源码中对ffmpeg头文件的引用

webrtc-m79-msvc编译H264,webrtc,webrtc

至此就可以编译通过所有的exe,但是还不可以使用peerconnection_client.exe验证H264的功能,需要修改SDP来提高H264的优先级;

注意:

由于自己所使用的ffmpeg版本问题(相较于webrtc-m79的代码来说ffmpeg的版本太新了),还出现了avcodec_find_decoder的问题,由于avcodec_find_decoder现在返回的是const AVCodec*,而webrtc-m79中没有进行强制类型转换导致编译错误,需要进行一个简单的修改即可:

AVCodec* codec = avcodec_find_decoder(av_context_->codec_id);

修改为:

AVCodec* codec = const_cast<AVCodec*>(avcodec_find_decoder(av_context_->codec_id));

3 提高H264优先级

修改后的代码如下:

std::vector<SdpVideoFormat> InternalEncoderFactory::GetSupportedFormats()
    const {
  std::vector<SdpVideoFormat> supported_codecs;
  for (const webrtc::SdpVideoFormat& format : webrtc::SupportedH264Codecs())
    supported_codecs.push_back(format);
  supported_codecs.push_back(SdpVideoFormat(cricket::kVp8CodecName));
  for (const webrtc::SdpVideoFormat& format : webrtc::SupportedVP9Codecs())
    supported_codecs.push_back(format);
  return supported_codecs;
}

4 两个peerconnection_client进行验证

运行peerconnection_client.exe,别忘了拷贝其所依赖的动态库:

webrtc-m79-msvc编译H264,webrtc,webrtc

测试效果如下:

webrtc-m79-msvc编译H264,webrtc,webrtc

5 web端与peerconnection_client测试

若使用web与peerconnection_client进行测试,则需要注意,若web端发送offer来启动媒体协商过程,此时传输的仍然是VP8编码,原因是:

web端offer中描述自己最高优先接收的是VP8,接收offer的peerconnection_client端会在WebRtcVideoChannel::GetChangedSendParameters中通过调用SelectSendVideoCodecs来对比自己能提供的编码和offer期望的编码,会优先匹配offer中具有较高优先级的VP8编码,在自己修改的代码中InternalEncoderFactory::GetSupportedFormats中只是将H264的优先级提高了而已(((这个H264优先级的提高在本端作为offer端的时候可以让对端优先匹配该编码))),后面又加上了对VP8和VP9的支持,所以当offer端最高优先级的VP8能在对端被支持的时候,就会优先选择VP8格式来匹配offer端;也正是这个原因在使用两个peerconnection_client进行测试的时候不会出现这个问题,因为二者都是将接收H264设置为最高优先级;

当然若peerconnection_client.exe发送offer来启动媒体协商过程就不存在这个问题了,因为H264就是它的最高优先级接收的视频编码格式。

参考链接

[1] webrtc 4577版本vs编译_tusong86的博客-CSDN博客

[2] 创建ffmpeg vs2019工程_hclbeloved的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-690483.html

到了这里,关于webrtc-m79-msvc编译H264的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt配置使用MSVC编译器

      Qt配置使用MSVC编译器_qt msvc-CSDN博客 注意:Qt支持的MSVC就是2017和2015,所以vs也要下载2017,不要直接用最新的,安装路径都用默认的。程序运行失败时可以尝试windeployqt拷贝库文件到本地,然后有可能就能运行了。VS官网下载Visual Studio Community 2017,在线安装Visual Studio Community

    2024年02月09日
    浏览(36)
  • 如何在Qt中配置MSVC编译器链接器参数?

    原标题:掌握VS项目配置 【进阶】— 编译器链接器配置 在上一篇基础篇中,我们主要探讨了VS的构造系统模型,了解了VS项目最基本的输入输出配置。输入输出是系统对外的功能接口,是系统最基础的部分。 在本章的进阶篇中,我们要探讨构造系统的内部参数。内部参数用于

    2024年02月15日
    浏览(38)
  • vs2015、vs2017、vs2019、msvc自动编译脚本

    rem 记录编译时间 echo ** 版本构建开始时间: %date% %time% build.log rem 设置编译器进程名 set DstProgram=devenv.exe rem 搜索目标进程以及其目录 echo 正在搜索\\\"%DstProgram%“, 请稍候… for %%a in (“C:Program Files (x86)”, “C:Program Files”, “D:Program Files (x86)”, “D:Program Files”) do for /f “delim

    2024年02月06日
    浏览(65)
  • QT学习笔记-QT5.15 + MSVC编译套件时编译日志及运行日志日志乱码解决

    操作系统:Windows10专业版 QT版本:QT5.15.2 QtCreator版本:9.0.2 MSVC版本:MSVC 2019 64bit C/C++编译器:Microsoft Visual C++ Compiler 17.1.32328.378(amd64) 调试器:Auto-detected CDB at C:Program FilesWindows Kits10Debuggersx64cdb.exe 文件编码的设置都是采用的默认值UTF-8,如下图: 当qt的项目采用MSVC构建套

    2024年02月14日
    浏览(44)
  • msvc++中的预编译头文件pch.hpp和stdafx.h

    在 Visual Studio 中创建新项目时,会在项目中添加一个名为 pch.h 的“预编译标头文件”。 (在 Visual Studio 2017 及更高版本中,该文件名为 stdafx.h)此文件的目的是加快生成过程。 应在此处包含任何稳定的标头文件,例如标准库标头(如 )。 预编译标头仅在它或它包含的任何文

    2024年02月10日
    浏览(21)
  • 03-编码篇-x264编译与介绍

    使用FFMPEG作编码操作时,会涉及到将yuv数据编码成h264数据,FFmpeg的libavcodec中的libx264.c会调用x264库的源码作编码: 1.x264库编译 下载X264,地址为:http://www.videolan.org/developers/x264.html,并解压。 mkdir my_build ./configure --enable-shared --prefix=./my_build/ make -j4 make install 2.编译后可以查看

    2024年02月02日
    浏览(22)
  • 查看Visual Studio软件_MSC_VER值(MSVC编译器版本)的方法

      本文介绍查看 Visual Studio 软件 _MSC_VER 值的方法。    _MSC_VER 是微软公司推出的 C/C++ 编译器—— MSVC 编译器的一个内置宏,其值表示当前 Visual Studio 软件中 MSVC 编译器的具体版本。不同的 Visual Studio 软件版本对应着不同的 MSVC 编译器版本——无论是不同发布年份的版本(

    2024年02月06日
    浏览(34)
  • Qt5.15.10+msvc2019_x86+qwebengine(含mp4)源码编译

    win10 64bit 英文版(或者把“区域”-“管理”-“非Unicode程序中所使用的当前语言”-改为\\\"英语(美国)\\\") 内存16g够用,cpu性能越高越好,硬盘在安装环境、下载源码后,至少还有100g可用空间 https://download.qt.io/archive/qt/5.15/ 1、安装 vs_community_2019.exe 勾选桌面C++开发工具 2、安装

    2024年02月09日
    浏览(39)
  • QT使用MSVC编译器报错:Project ERROR: Cannot run compiler ‘cl‘以及后续问题解决

    记录一次qtcreator工程使用MSVC创建报错“ Project ERROR: Cannot run compiler ‘cl’ ”,没办法运行编译器cl。 只显示 qmake配置文件 不出现工程文件, 在qtcreator安装目录下的MSVC2017确实并未找到cl.exe文件,于是下载了everything搜索软件,在电脑上找到了VSstudio的安装目录下MSVC2017编译器下

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包