2017-01-23 4 views
2

В this document он использует URL.createObjectURL для установки источника видео. (Это код для ответа на вызов).Почему удаленный источник видеоролика WebRTC сгенерирован URL.createObjectURL

var offer = getOfferFromFriend(); 
navigator.getUserMedia({video: true}, function(stream) { 
    pc.onaddstream = e => video.src = URL.createObjectURL(e.stream); 
    pc.addStream(stream); 

    pc.setRemoteDescription(new RTCSessionDescription(offer), function() { 
    pc.createAnswer(function(answer) { 
     pc.setLocalDescription(answer, function() { 
     // send the answer to a server to be forwarded back to the caller (you) 
     }, error); 
    }, error); 
    }, error); 
}); 

Ожидалось, что video.src будет адресом для извлечения удаленного видео. Поэтому он должен быть исправлен и задан другой стороной соединения (кто бы ни инициировал вызов). Но значение URL.createObjectURL генерируется на стороне ответчика, и это событие зависит от того, когда вызывается функция. Как его можно использовать для получения удаленного видеопотока?

Редактировать: Результат URL.createObjectURL выглядит как blob: http://some.site.com/xxxx-the-token-xxxx. С помощью этой строки, как компонент видео знает, где загрузить удаленный поток? Есть ли hashmap {url: stream} где-то? Если да, то как видеокомпонент получает доступ к хэш-карте?

Объект потока хранит строку токена, которую вы можете получить с помощью stream.toURL. Но он отличается от результата URL.createObjectURL. Значение URL.createObjectURL зависит от времени. Если вы вызываете его дважды подряд, вы получаете разные значения.

ответ

6

URL.createObjectURL(stream) является взломом. Прекратите использовать его. Усилия ведутся до remove it.

Используйте вместо этого video.srcObject = stream. Он является стандартным и хорошо реализованным.

Это назначение локального ресурса никогда не должно было быть URL-адресом в первую очередь и является красной серой для понимания того, как работает WebRTC.

WebRTC - это API-интерфейс передачи данных, отправляющий данные непосредственно от одного партнера к другому. URL-адреса контента не задействованы. Удаленный stream, который вы получаете от onaddstream, является локальной стороной приемника объекта и представляет собой прямой трансляционный результат передачи, готовый к воспроизведению.

Документация, которую вы читаете, устарела и устарела. Спасибо, что указали, я исправлю это. У этого есть другие проблемы: вы должны вызвать setRemoteDescription сразу, не дожидаясь, пока ресивер передаст свою камеру, в противном случае входящие кандидаты будут упущены. Вместо кода вы показываете, сделайте следующее:

pc.onaddstream = e => video.srcObject = e.stream; 

function getOfferFromFriend(offer) { 
    return pc.setRemoteDescription(new RTCSessionDescription(offer)) 
    .then(() => navigator.getUserMedia({video: true})) 
    .then(stream => { 
     pc.addStream(stream); 
     return pc.createAnswer(); 
    }) 
    .then(answer => pc.setLocalDescription(answer)) 
    .then(() => { 
     // send the answer to a server to be forwarded back to the caller (you) 
    }) 
    .catch(error); 
} 

Он использует srcObject, избегает устаревшего обратного вызова API, и не будет вызывать периодические сбои ICE.

+0

Спасибо, стрела! Это помогло мне сузить причины моей проблемы. Но я до сих пор не могу понять свою оригинальную проблему. Не могли бы вы взглянуть на мой вопрос [здесь] (http://stackoverflow.com/q/41917545/3838949)? Мой iceConnectionState перескакивает с 'check' на' closed'. Я не уверен, что вызывает проблему. –

1

Поскольку соединение WebRTC включает в себя несколько шагов, и то, что вы получаете от такого соединения, является потоком. Но свойство src тега video не принимает поток, а URL. И это способ «конвертировать» поток в URL.

+0

Я понимаю, что вам нужен URL-адрес, но я не понимаю, почему URL-адрес создается таким образом. Я в ситуации, когда мне нужно написать 'URL.createObjectURL' сам, потому что он недоступен в React Native. Поэтому я попытался использовать 'stream.toURL', которые производят токен, отличный от того, что производит' URL.createObjectURL'. Кажется, что видеокомпонент не может правильно получить удаленное видео с помощью этого токена. Значение 'stream.toURL' на самом деле имеет больше смысла для меня, потому что оно не зависит от времени. –

+0

Результат 'URL.createObjectURL' выглядит как' blob: http: // some.site.com/xxxx-the-token-xxxx'. С этой строкой, как видеокомпонент знает, где загрузить удаленный поток? Есть ли хэш-файл '{url: stream}' где-то хранится? Если да, то как видеокомпонент получает доступ к хэш-карте? –

+0

Это сопоставление является внутренним для браузера.Я не думаю, что вы можете каким-либо образом получить доступ/контролировать его. –