webrtc.org native를 사용하여 MacOS 프로그램

9839 단어 WebRTC

개요



결국 MacOS, Android, iOS에서
unity와 webrtc를 함께 사용하여 다양한 작업을 수행하는 것이 목표

우선 이번에는 MacOS에서 사용할 수 있는 준비를 하는 것이 목표
여기에 쓰여진 내용은 우선 제가 잘 됐다는 이야기입니다.

여기에 샘플을 둘 예정
htps : // 기주 b. 이 m / k와 d / 우니 ty ぇ brtc P ㅅ

라이브러리 컴파일



htps : // ぇ brtc. 오 rg / 나치 ゔ ぇ 코코 / / ゔ ぇ p 면 t /
여기에 따라 ninja에서 build를 실시한다.

사용한 버전은 다음과 같습니다.
$ cat .gclient_entries 
entries = {
  'src': 'https://webrtc.googlesource.com/src.git',
  'src/base': 'https://chromium.googlesource.com/chromium/src/base@1325ca683ab2b427aa27112cfff53614328a1781',
  'src/build': 'https://chromium.googlesource.com/chromium/src/build@d9b1b8481806794959fae0ced886a212d9746057',
  'src/buildtools': 'https://chromium.googlesource.com/chromium/buildtools.git@1be57dc4c2c68fa564ee258a3af0cf8003007edf',
  'src/testing': 'https://chromium.googlesource.com/chromium/src/testing@8e923163dd2388b953418843ff9be4b7177023ce',
  'src/third_party': 'https://chromium.googlesource.com/chromium/src/third_party@bacc4e1bcc117fffae9e8007434c1116a950e63b',
  'src/third_party/boringssl/src': 'https://boringssl.googlesource.com/boringssl.git@02e6256b16b54319b1c01d4133ca3317e82b2dbb',
  'src/third_party/catapult': 'https://chromium.googlesource.com/catapult.git@3b3f9e1e789dbed2726dcd3c97d9dcd080ca7f23',
  'src/third_party/colorama/src': 'https://chromium.googlesource.com/external/colorama.git@799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8',
  'src/third_party/depot_tools': 'https://chromium.googlesource.com/chromium/tools/depot_tools.git@ebe839b6bfc3e9276b8d1e42a0d6e830bb04899e',
  'src/third_party/ffmpeg': 'https://chromium.googlesource.com/chromium/third_party/ffmpeg.git@423f74fab02ff573b52abd542eb5dfdadaa05cf4',
  'src/third_party/googletest/src': 'https://chromium.googlesource.com/external/github.com/google/googletest.git@247a3d8e5e5d403f7fcacdb8ccc71e5059f15daa',
  'src/third_party/gtest-parallel': 'https://chromium.googlesource.com/external/github.com/google/gtest-parallel@180c2f52341c065fd4d8418a238375ab6c91b336',
  'src/third_party/icu': 'https://chromium.googlesource.com/chromium/deps/icu.git@94d819fa3e7e71f3dd8210d428c213ddb6e2b336',
  'src/third_party/jsoncpp/source': 'https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git@f572e8e42e22cfcf5ab0aea26574f408943edfa4',
  'src/third_party/libFuzzer/src': 'https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git@ba2c1cd6f87accb32b5dbce297387c56a2e53a2f',
  'src/third_party/libjpeg_turbo': 'https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@a1750dbc79a8792dde3d3f7d7d8ac28ba01ac9dd',
  'src/third_party/libsrtp': 'https://chromium.googlesource.com/chromium/deps/libsrtp.git@1d45b8e599dc2db6ea3ae22dbc94a8c504652423',
  'src/third_party/libvpx/source/libvpx': 'https://chromium.googlesource.com/webm/libvpx.git@a2127236ae4742f329e5571d76b84de08cd3b8ea',
  'src/third_party/libyuv': 'https://chromium.googlesource.com/libyuv/libyuv.git@c67db6053495a2744511a43ba7b6ba3fa49b26a5',
  'src/third_party/openh264/src': 'https://chromium.googlesource.com/external/github.com/cisco/openh264@a180c9d4d6f1a4830ca9eed9d159d54996bd63cb',
  'src/third_party/openmax_dl': 'https://webrtc.googlesource.com/deps/third_party/openmax.git@b611996df3b8f6b151339d22c12c21f167009cb6',
  'src/third_party/usrsctp/usrsctplib': 'https://chromium.googlesource.com/external/github.com/sctplab/usrsctp@0e076261b832121cf120ddc04aaff87ac3a34d30',
  'src/third_party/yasm/source/patched-yasm': 'https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git@b98114e18d8b9b84586b10d24353ab8616d4c5fc',
  'src/tools': 'https://chromium.googlesource.com/chromium/src/tools@56fadf9c9eb4669df2478c511e672326a4b3fba0',
  'src/tools/gyp': 'https://chromium.googlesource.com/external/gyp.git@d61a9397e668fa9843c4aa7da9e79460fe590bfb',
  'src/tools/swarming_client': 'https://chromium.googlesource.com/infra/luci/client-py.git@4bd9152f8a975d57c972c071dfb4ddf668e02200',
  'src/buildtools/clang_format/script': 'https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git@0653eee0c81ea04715c635dd0885e8096ff6ba6d',
  'src/buildtools/third_party/libc++/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxx.git@f56f1bba1ade4a408d403ff050d50e837bae47df',
  'src/buildtools/third_party/libc++abi/trunk': 'https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git@05ba3281482304ae8de31123a594972a495da06d',
  'src/buildtools/third_party/libunwind/trunk': 'https://chromium.googlesource.com/external/llvm.org/libunwind.git@fc0a910c25d5415dd72ba9451b7cba380e3cc1e7',
}

build한 결과 필요한 것은, 이하의 라이브러리
out/Release/obj/third_party/boringssl/libboringssl.a
out/Release/obj/rtc_base/librtc_base.a
out/Release/obj/rtc_base/librtc_base_generic.a
out/Release/obj/libwebrtc.a

그리고 boringssl의 asm 코드에서 생성 된 것.
이것은 lib*.a의 형태가 되지 않았기 때문에, ar 명령으로 archive로 했다.
$ cd out/Release/obj/third_party/boringssl
$ ar r libhogehoge.a boringssl_asm/*.o

뭐, 별로 libhogehoge.a일 필요는 없지만・・・

이것으로 필요한 라이브러리는 갖추어졌다.

실제로 적당한 프로그램을 짜 봅시다.



unity와 연동시켜 동작할 예정이므로, 라이브러리를 bundle로, 짜서 mono를 통해 실행하기로 하겠습니다.

번들 만들기 시작



xcode를 열고 Create a new Xcode project를 선택합니다.


여기서 선택하는 것은 MacOS에서 Bundle입니다.
우선 UnityWebrtcPlugin이라고 했습니다.

프로젝트 설정의 Build Settings에서 Per-configuration Build Products Path를 Products로 다시 씁니다.

mono 경유로 뭐든지 좋으니까 call 해 본다.



New File에서 cpp 파일 만들기
이름을 적절하게 Entry로 실행하면
Entry.cpp와 Entry.hpp가 가능하다.

그리고이 Entry.cpp를 이름 바꾸고 Entry.mm로 설정하십시오.
이제 Objective-c++로 프로그래밍이 가능하다.

적당히
#include "Entry.hpp"
#include <iostream>

using namespace std;
extern "C" {
  void test() 
  {
    cout << "test is called." << endl;
  }
}


라는 코드를 만들어
빌드 실행

그러면 Project 디렉토리 아래에
Products/UnityWebrtcPlugin.bundle이 가능하다.

그런 다음 Project 디렉토리 아래에
mono라는 디렉토리 만들기
거기 test.cs를 만든다.

test.cs
using System;
using System.Runtime.InteropServices;

public class Test {
  static public void Main() {
    Console.WriteLine("test is called.");
  }
}
$ mcs test.cs

실행하면 test.exe가 완성됩니다.
$ mono test.exe
test is called.

이렇게 하면 실행할 수 있다.

다음으로 bundle의 함수를 call 해 본다.
using System;
using System.Runtime.InteropServices;

public class Test {
  [DllImport("../Products/UnityWebrtcPlugin.bundle/Contents/MacOS/UnityWebrtcPlugin")]
  static extern void test();
  static public void Main() {
    test();
  }
}

이것을 같은 방법으로 mcs로 컴파일하고 mono에서 실행하면 ...
$ mono test.exe
test is called.

test()가 call되어 문자열이 표시된다.

Unity에서 call하는 경우
[DllImport("UnityWebrtcPlugin")]

그냥 지정 OK입니다.

샘플
htps : // 기주 b. 코 m / 타 k와 d / 우니 ty ぇ brtcP ぅ 긴 / 쓰레기 t / 24c66858623 엣 c98df5dc 7640285203432

webrtc를 조금 동작시켜 보자.



5개의 라이브러리를 Project 디렉토리에 복사합니다.
에서 Add Files to "UnityWebrtcPlugin"...에서 가져오면
Build Phases, Link Binary With Libraries에 포함된다.

그리고 framework도 몇 가지 필요하므로, 넣어 간다.
필요한 것은
CoreVideo
CoreMedia
AVFoundation
CoreGraphics
AudioToolbox
CoreAudio
Foundation
CFNetwork
Security
OpenGL
Metal

11개의 프레임워크

Header Search Path를 다시 작성하여 webrtc/src/의 디렉토리로 향한다.
우선 나는 ~/Documents/gn/webrtc/src를 향했습니다.

Preprocessor Macros를 설정합니다.
NOGUI=1
OPENSSL_IS_BORINGSSL=1
WEBRTC_POSIX=1
WEBRTC_MAC=1

이것만 필요

우선 코드도 갱신해, webrtc로 필요한 thread와 ssl 주위의 초기화만 해 보았습니다.

실행 결과는 다음과 같습니다.
$ mono test/exe
make is called
clean is called
処理おわり

실제로 프로그램을 조립해 나가는 것은
htps : // m / k와 d / ms / 76f0fc450745 e5 87f57
여기에서 해 보았습니다.

좋은 웹페이지 즐겨찾기