This blog is in continuation to the attempts / outcomes and problems in building a WebRTC to RTP media framework that successfully stream / broadcast WebRTC content to non webrtc supported browsers ( safari / IE ) / media players ( VLC ).
Attempt 4: Stream the content to a WebRTC endpoint which is hidden in a video call . Pick the stream from vp8 object URL send to a streaming server
This process involved the following components :
- WebRTC API : simplewebrtc on Chrome
- Transfer mechanism from client to Streaming server: webrtc media channel
Problems : No streaming server is qualified to handle a direct webrtc input and stream it on network .
Attempt 4.1 : Stream the content to a WebRTC endpoint . Do WebRTC Endpoint to RTP Endpoint bridge using Kurento APIs.
Use the RTP port and ip address to input into a ffmpeg or gstreamer or VLC terminal command and out put a live H264 stream on another ip and port address .
This process involved the following components :
- API : Kurento
- Transfer mechanism : HTML5 webrtc client -> application server hosting java -> media server -> application for webrtc media to RTP media conversation -> RTP player
Screenshots of attempts with Wowza to stream RTP from a IP and port

Problems : The stream was black which means 100% loss.
Lesson learned : RTP is not suitable for over the intgernet transmission especially with firewalls
Attempt 4.2 : Build a WebRTC Endpoint to Http endpoint in kurento and force the video audio encoding to be that of H264 and PCMU.
Code snippet for adding constraints to output media via pipeline and forcing choice of codecs( H264 for video and PCMU for audio ).
MediaPipeline pipeline = kurento.createMediaPipeline();
WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build();
HttpGetEndpoint httpEndpoint=new HttpGetEndpoint.Builder(pipeline).build();
org.kurento.client.Fraction fr= new org.kurento.client.Fraction(1, 30);
VideoCaps vc= new VideoCaps(VideoCodec.H264,fr);
httpEndpoint.setVideoFormat(vc);
AudioCaps ac= new AudioCaps(AudioCodec.PCMU, 65536);
httpEndpoint.setAudioFormat(ac);
webRtcEndpoint.connect(httpEndpoint);
Alternatively one can opt to use gstreamer filter to force the output in raw format.
// basic media operation of 1 pipeline and 2 endpoints
MediaPipeline pipeline = kurento.createMediaPipeline();
WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build();
RtpEndpoint rtpEndpoint = new RtpEndpoint.Builder(pipeline).build();
// adding Gstream filters
GStreamerFilter filter1 = new GStreamerFilter.Builder(pipeline, "videorate max-rate=30").withFilterType(FilterType.VIDEO).build();
GStreamerFilter filter2 = new GStreamerFilter.Builder(pipeline, "capsfilter caps=video/x-h264,width=1280,height=720,framerate=30/1").withFilterType(FilterType.VIDEO).build();
GStreamerFilter filter3 = new GStreamerFilter.Builder(pipeline, "capsfilter caps=audio/x-mpeg,layer=3,rate=48000").withFilterType(FilterType.AUDIO).build();
// connecting all poin ts to one another
webRtcEndpoint.connect (filter1);
filter1.connect (filter2);
filter2.connect (filter3);
filter3.connect (rtpEndpoint);
// RTP SDP offer and answer
String requestRTPsdp = rtpEndpoint.generateOffer();
rtpEndpoint.processAnswer(requestRTPsdp);
End result : The output is still webm based and doesnt work on h264 clients.
Attempt 5 : Use a RTP SDP Endpoint ( ie a SDP file valid for a given session ) and use it to play the WebRTC media over Wowza streaming server
This process involved the following components
- WebRTC Stream and object URL of the blob containing VP8 media
- Kurento WebRTC Endpoint bridge to generate SDP
- Wowza Streaming server
Snippet used for kurento to generate a SDP file from WebRTC to RTP bridge
@RequestMapping(value = "/rtpsdp", method = RequestMethod.POST) private String processRequestrtpsdp(@RequestBody String sdpOffer) throws IOException, URISyntaxException, InterruptedException { //basic media operation of 1 pipeline and 2 endpoinst MediaPipeline pipeline = kurento.createMediaPipeline(); WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(pipeline).build(); RtpEndpoint rtpEndpoint = new RtpEndpoint.Builder(pipeline).build(); //connecting all poin ts to one another webRtcEndpoint.connect (rtpEndpoint); // RTP SDP offer and answer String requestRTPsdp = rtpEndpoint.generateOffer(); rtpEndpoint.processAnswer(requestRTPsdp); // write the SDP conector to an external file PrintWriter out = new PrintWriter("/tmp/test.sdp"); out.println(requestRTPsdp); out.close(); HttpGetEndpoint httpEndpoint = new HttpGetEndpoint.Builder(pipeline).build(); PlayerEndpoint player = new PlayerEndpoint.Builder(pipeline, requestRTPsdp).build(); httpEndpoint.connect(rtpEndpoint); player.connect(httpEndpoint); // Playing media and opening the default desktop browser player.play(); String videoUrl = httpEndpoint.getUrl(); System.out.println(" ------- video URL -------------"+ videoUrl); // send the response to front client String responseSdp = webRtcEndpoint.processOffer(sdpOffer); return responseSdp; }
End result : wowza doesnt not recognize the WebRTC SDP and play the video
screenshot of wowza with SDP input

Attempt 5.1 : Use a RTP SDP Endpoint ( ie a SDP file valid for a given session ) and use it to play the WebRTC media over Default Ubuntu media player
SDP file formed contains contents such as :
v=0 o=- 3631611195 3631611195 IN IP4 192.168.0.119 s=Kurento Media Server c=IN IP4 192.168.0.119 t=0 0 m=audio 42802 RTP/AVP 98 99 0 a=rtpmap:98 OPUS/48000/2 a=rtpmap:99 AMR/8000/1 a=rtpmap:0 PCMU/8000 a=ssrc:2713728673 cname:user59375791@host-ad1117df m=video 35946 RTP/AVP 96 97 100 101 a=rtpmap:96 H263-1998/90000 a=rtpmap:97 VP8/90000 a=rtpmap:100 MP4V-ES/90000 a=rtpmap:101 H264/90000 a=ssrc:93449274 cname:user59375791@host-ad1117df
End result : wowza doesnt not recognize the WebRTC SDP and play the video : deformed media
screenshot of playing from a SDP file

Attempt 5.2 : Use a RTP SDP Endpoint ( ie a SDP file valid for a given session ) and use it to play the WebRTC media over VLC using socket input
End result : nothing plays
screenshot of VLC connected to play from socket and failure to play anything

Attempt 5.3: Create a WebRTC endpoint and connected it to RTP endpoint via media pipelines . Also make the RTP SDP offer and answering the same . Play with ffnpeg / ffplay / gst playbin
String requestRTPsdp = rtpEndpoint.generateOffer();
rtpEndpoint.processAnswer(requestRTPsdp);
Write the requestRTPsdp to a file and obtain a RTP connector endpoint with Application/SDP .It plays okay with gst playbin ( 10 secs without audio ). Successful attempt to play from a gst playbin
gst-launch -vvv playbin uri=file:///tmp/test.sdp

but refuses to be played by VLC , ffplay and even wowza . The error generated with
ffmpeg -i test.sdp -vcodec copy -acodec copy -f mpegts output-file.ts
or
ffmpeg -re -i test.sdp -vcodec h264 -acodec mp3 -f mpegts "udp://192.168.4.26:5000"
End result : This results in “Could not find codec parameter for stream1 ( video:h263, none ) .Other errors types are , Could not write header for output file output file is empty nothing was encoded”
Error screenshots of trying to play the RTP SDP file with ffmpeg


Attempt 6 : Use a WebRTC capable media and streaming server ( eg Kurento ) to pick a live stream of VP8 .
Convert the VP8 to H264 ( ffmpeg / RTP endpoint )
Convert H264 to Mp4 using MP4 parser and pass to a streaming server ( wowza)
End Result : yes it did work on mozilla but with considerable lag
Update : Thankfully the updates to WebRTC standards mandated the support for PCMU and AVC/H264 CB profile in the media stack of the browser thus solving the “from scratch buildup of transcoder between webrtc and non webrtc endpoints”.
- Video Codecs : RFC 7742 specifies that all WebRTC-compatible browsers must support VP8 and H.264’s Constrained Baseline profile for video.
- Audio Codecs : RFC 7874 specifies that browsers must support at least the Opus codec as well as G.711’s PCMA and PCMU formats.
The latest Webrtc specification lists a set of codecs which all compliant browsers are required to support which includes chrome 52 , Firefox , safari , edge.
References :
- RFC7742: WebRTC Video Processing and Codec Requirements
- RFC 7874: WebRTC Audio Codec and Processing Requirements
Read more about Webrtc Audio Video Codecs
Stumbled on this post because I’ve been trying to do exactly the same – use kurento to give me an RTP stream from a WebRTC input. Have you had any luck getting this working since this post? Any suggestions for alternatives? Ideally I want to be able to pick up the stream with fffmpeg.
Can you plz post us the result? any luck?
Thanks for your experiments. Have you had any new progress?
Please fix the type in “Convert the VP8 to H268” there should either h263 or h264
done thank you for pointing it out
This is great! Thanks for sharing all of this hard work. Wowza Streaming Server now seems to support WebRTC. I’m trying it out now.