Как я могу изменить кодек по умолчанию, используемый в WebRTC?

Я искал способ изменить кодек в реализации WebRTC в Chrome, но, похоже, нет способа.

Как изменить используемый по умолчанию кодек (аудио или видео) в соединении WebRTCpeer в Chrome?


person Tony    schedule 14.11.2014    source источник
comment
Возможный дубликат Есть ли способ выбрать кодеки в WebRTC Одноранговое соединение?   -  person user    schedule 13.10.2016


Ответы (1)


Да, вы можете изменить кодек на любой, какой захотите... если Chrome его поддерживает. На данный момент в отношении звука поддерживаются только следующие кодеки: PCMA, PCMU, ISAC и OPUS (по умолчанию). Для видео у вас есть VP8 (также H264 в некоторых системах с FireFox).

Чтобы использовать любой из этих кодеков по умолчанию, вы должны изменить свой SDP, прежде чем настраивать его локально в своем одноранговом соединении и отправлять свое предложение/ответ. Я успешно протестировал, заставив Chrome по умолчанию отправлять PCMA вместо OPUS.

Например:

Скажем, у вас есть раздел аудио SDP по умолчанию, который выглядит следующим образом (примечания в скобках не являются частью sdp)

m=audio<media> 49353<port> RTP/SAVPF<proto> 111 103 104 0 8 106 105 13 126 <rtpformats>

c=IN<nettype> IP4<addrtype> 192.168.0.13<address>

a=rtcp:49353<port> IN<nettype> IP4<addresstype> privateIP<connection address>

a=candidate:1204296370 1 udp 2122260223 privateIP 49353 typ host generation 0 <audioIceCandidate>
a=candidate:1204296370 2 udp 2122260223 privateIP 49353 typ host generation 0
a=candidate:155969090 1 tcp 1518280447 privateIP  0 typ host generation 0
a=candidate:155969090 2 tcp 1518280447 privateIP  0 typ host generation 0
a=ice-ufrag:E7VFzFythTIOaQ6X <ice username>
a=ice-pwd:ZMHFqqXEA8JLjItZcRN4FZDJ <ice-password>
a=ice-options:google-ice <iceoptions>
a=fingerprint:sha-256<encryptType> 66:2D:43:3A:31:7B:46:56:50:D7:CC:75:80:79:5D:88:7D:5D:1B:0E:C7:E6:F9:C4:68:6D:51:7F:4B:32:97:A1<print>
a=setup:actpass <dtls setup mode>
a=mid:audio   
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level <extention map>
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv <mediamode>
a=rtcp-mux <says rtcp mux>
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:60

Если вы хотите использовать ТОЛЬКО PCMA, вы должны изменить строку m=audio на следующую: m=audio 49353 RTP/SAVPF 8 таким образом будет учитываться только полезная нагрузка PCMA. Затем вам нужно удалить все строки rtpmap, которые не соответствуют этой полезной нагрузке, то есть любые a=rtpmap:, где следующий символ НЕ является 8. Если вы установите этот модифицированный sdp локально и отправите его своему узлу (и если они ПОДДЕРЖИВАЮТ PCMA.. .не обязательно должен быть для них по умолчанию, поскольку переговоры заставят использовать PCMA, если вы только предложите его), тогда PCMA будет вашим аудиокодеком, а не OPUS.

Пара отступлений:

  • SDP, о котором я говорю, сгенерирован и передан через обратный вызов успеха функций createOffer и createAnswer однорангового соединения.
  • Этот тип идеи будет работать для ДОБАВЛЕНИЯ кодеков, которые, как вы знаете, поддерживаются базовыми системами (H264, SPEEX и т. д.). Просто не забудьте добавить полезную нагрузку и соответствующие сопоставления и параметры (fmtp необходимо для h264, так как профили важны и, возможно, sprop-parameter-sets).
  • Это будет работать с любой системой WebRTC с соответствующим кодом, например, с Firefox, Opera и т. д. Не только с Chrome.
person Benjamin Trent    schedule 14.11.2014
comment
Привет, Бенджамин. Благодаря вашему совету мне удалось изменить аудиокодек (Opus на PCMA). Однако, когда я попытался изменить видеокодек (на h.264), видео ничего не показывает. Поддерживает ли Chrome смену видеокодека? - person Tony; 22.11.2014
comment
В настоящее время Chrome вообще не поддерживает H.264, Firefox, я думаю, поддерживает базовую систему (я видел, что Firefox предлагает его в качестве опции в своих последних выпусках). - person Benjamin Trent; 22.11.2014
comment
@BenjaminTrent: Не могли бы вы поделиться основной документацией по улучшению качества Opus или iSac? Где найти руководство по SDP, связанное с аудиокодеком, пожалуйста? - person ; 21.02.2015
comment
На Opus влияет динамическое изменение битрейта, поэтому браузер может снижать битрейт Вот rfc, ссылающийся на формат полезной нагрузки RTP opus. В этом разделе, на который я ссылаюсь, должны быть указаны параметры кодека. Может помочь создание CBR (постоянный битрейт) и установка относительно высокой скорости. - person Benjamin Trent; 21.02.2015
comment
Если вы собираетесь удалить строки a=rtpmap, обязательно удалите строки a=rtcp-fb и a=fmtp для одного и того же идентификатора кодека, иначе браузер может пожаловаться (например, если вы удалите 8 из m = строка, затем удалите строки a=rtpmap:8, a=rtcp-fb:8 и a=fmtp:8) - person ssmith; 10.11.2016
comment
@BenjaminTrent Можете ли вы дать ссылку, где говорится, что хром не поддерживает кодировку h264. Насколько я знаю, это хром на Android без кодека h264. - person bugwheels94; 04.04.2018
comment
@bugwheels94 все изменилось за последние 3 с лишним года с тех пор, как я написал этот комментарий :). Я думаю, что более новые версии Chrome поддерживают H264 во многих системах, хотя я не знаю точного списка. Я протестировал H264 в Chrome 65, и он отлично работал. Когда я писал этот комментарий, H264 в Chrome только начинал фазу эксперимента и был доступен только через флажок в настройках браузера. - person Benjamin Trent; 04.04.2018
comment
@BenjaminTrent знаете ли вы, какие строки мне нужно добавить, чтобы добавить кодек H264 в предложение? По какой-то причине Chrome на Android непостоянен — только иногда включает его в предложение, несмотря на то, что он может его поддерживать. - person Andrew; 24.05.2020
comment
@ Эндрю, я давно не работал над технологией webrtc. Этот вопрос/ответ может помочь вам stackoverflow.com/a/29434735/1818849 . Обратите внимание, что h264 может не поддерживаться на ВСЕХ устройствах Android, поскольку не все устройства Android поддерживают аппаратное ускорение h264: stackoverflow.com/questions/36766716/ - person Benjamin Trent; 26.05.2020