WebRT C: как передать RTCVideoEncoderSettings в RTCVideoEncoder - PullRequest
4 голосов
/ 25 апреля 2020

Я работаю над приложением webrt c screensharing. Поэтому я использую цель- c webrt c framework.

Теперь у меня проблемы с передачей RTCVideoEncoderSettings (http://cocoadocs.org/docsets/GoogleWebRTC/1.1.20266/Classes/RTCVideoEncoderSettings.html) в кодировщик (VP9) , Это то, что у меня сейчас есть:

public class CustomVideoEncoderFactory : NSObject, RTCVideoEncoderFactory {

var encoder: RTCVideoEncoder?
var preferredCodec: RTCVideoCodecInfo = RTCVideoCodecInfo(name: "VP9")

public func createEncoder(_ info: RTCVideoCodecInfo) -> RTCVideoEncoder? {

    let vp9Encoder = RTCVideoEncoderVP9.vp9Encoder()!
    // How to pass the RTCVideoEncoderSettings into this encoder???
    return vp9Encoder
}

public func supportedCodecs() -> [RTCVideoCodecInfo] {
    return [RTCVideoCodecInfo(name: "VP9")]
}

}

Есть метод startEncodeWithSettings (http://cocoadocs.org/docsets/GoogleWebRTC/1.1.20266/Protocols/RTCVideoEncoder.html), но я не уверен, как его интегрировать с моим текущий код Я пытался создать подкласс (public class CustomVideoEncoder: NSObject, RTCVideoEncoder { ... }), который не работал.

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Хорошо, я нашел решение. Оказывается, что для VP9 и VP8 отсутствуют обёртки цели - c. VP9 и Vp8 являются прямой ссылкой на нативную реализацию! Следовательно, возможно использовать подкласс ТОЛЬКО, если вы используете h264. Для изменения настроек на VP9 и VP8 необходимо изменить настройки внутри кода c ++!

Пример пользовательской фабрики кодировщика:

public class CustomVideoEncoderFactory : NSObject, RTCVideoEncoderFactory {

public func createEncoder(_ info: RTCVideoCodecInfo) -> RTCVideoEncoder? {

    let encoder = super.createEncoder(info) // will create the h264 encoder
    let customEncoder = CustomVideoEncoder()
    self.encoder = vp9Encoder
    return encoder
}

public func supportedCodecs() -> [RTCVideoCodecInfo] {

    return [RTCVideoCodecInfo(name: kRTCVideoCodecH264Name)] }}

Пример пользовательского кодировщика:

public class CustomVideoEncoder: NSObject, RTCVideoEncoder {

public var encoder: RTCVideoEncoder? // ONLY WORKS WITH h264

public func setCallback(_ callback: @escaping RTCVideoEncoderCallback) {

    return encoder!.setCallback(callback)
}

 public func startEncode(with settings: RTCVideoEncoderSettings, numberOfCores: Int32) -> Int {

     // Change settings here !
    let res = encoder!.startEncode(with: settings, numberOfCores: numberOfCores) 
}

public func release() -> Int {

    return encoder!.release()
}

 public func encode(_ frame: RTCVideoFrame, codecSpecificInfo info: RTCCodecSpecificInfo?, frameTypes: [NSNumber]) -> Int {

     return encoder!.encode(frame, codecSpecificInfo: info, frameTypes: frameTypes)
 }

public func setBitrate(_ bitrateKbit: UInt32, framerate: UInt32) -> Int32 {

    return encoder!.setBitrate(bitrateKbit, framerate: framerate)
}

public func implementationName() -> String {

    return encoder!.implementationName()
}

public func scalingSettings() -> RTCVideoEncoderQpThresholds? {

    return encoder!.scalingSettings()
}}
0 голосов
/ 03 мая 2020

startEncodeWithSettings - это метод экземпляра, поэтому вы используете его с экземпляром его типа - вы пробовали [encoder startEncodeWithSettings:param1 numberOfCores:param2]?

...