Streaming to YouTube Live
Yuan, Feng
feng.yuan at intel.com
Mon May 6 01:18:02 PDT 2013
I don't know the protocol about YouTube Live. If it's RTMP and has hand-shake. It's possible Adobe Flash Player refused your connection since there's some encrypted/signature data in hand-shake to verify the sever. It may only accept data from Adobe Flash Server. Maybe you can try an old flash player version.
From: gstreamer-devel-bounces+feng.yuan=intel.com at lists.freedesktop.org [mailto:gstreamer-devel-bounces+feng.yuan=intel.com at lists.freedesktop.org] On Behalf Of Peter Maersk-Moller
Sent: Monday, May 06, 2013 5:18 AM
To: Discussion of the development of and with GStreamer
Subject: Re: Streaming to YouTube Live
Hi Chuck.
Thanks for your suggestion.
I don't see much else of interesting info from other elements than rtmpsink. Below is an extract of the debug=8 output (perhaps level=5 is max) .I've included a little bit of the pad capability listing too.
As you can see, rtmpsink gets to send about 92k of data before it quits with the message RTMP send error 104. It quits roughly 5 times out of 6 with that message and sometimes it just quits (without the RTMP send error).
Suggestions are very welcome .Perhaps rtmpsink just doesn't work with YouTube Live for yet unknown reasons. However largely same setup works with UStream. And I have checked that the URL works with a Flash Live Media Encoder sending to YouTube. Perhaps some yet to me unknown mode is invoked by the Flash Live Media Encoder, a mode not yet supported by rtmpsink.
Anyway, as written, suggestions are very welcome. It would be rather cool if we can get GStreamer and rtmpsink to work with YouTube Live.
Best regards
Peter
/GstPipeline:pipeline0/GstFaac:faac0.GstPad:sink: caps = audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)1, channel-positions=(GstAudioChannelPosition)< GST_AUDIO_CHANNEL_POSITION_FRONT_MONO >
/GstPipeline:pipeline0/GstFlvMux:mux.GstPad:audio: caps = audio/mpeg, mpegversion=(int)2, channels=(int)1, rate=(int)44100, stream-format=(string)raw, codec_data=(buffer)
/GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:src: caps = video/x-h264, width=(int)640, height=(int)360, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, codec_data=(buffer)014d4029ffe10018674d4029eca05017fcb8088000000300bb9aca00078c18cb01000468ebecb2, stream-format=(string)avc, alignment=(string)au, level=(string)4.1, profile=(string)main
/GstPipeline:pipeline0/GstX264Enc:x264enc0.GstPad:sink: caps = video/x-raw-yuv, level=(string)4.1, profile=(string)main, format=(fourcc)YV12, framerate=(fraction)30/1, width=(int)640, height=(int)360, color-matrix=(string)sdtv, chroma-site=(string)mpeg2
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = video/x-h264, width=(int)640, height=(int)360, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, codec_data=(buffer)014d4029ffe10018674d4029eca05017fcb8088000000300bb9aca00078c18cb01000468ebecb2, stream-format=(string)avc, alignment=(string)au, level=(string)4.1, profile=(string)main
/GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = video/x-h264, width=(int)640, height=(int)360, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, codec_data=(buffer)014d4029ffe10018674d4029eca05017fcb8088000000300bb9aca00078c18cb01000468ebecb2, stream-format=(string)avc, alignment=(string)au, level=(string)4.1, profile=(string)main
/GstPipeline:pipeline0/GstFlvMux:mux.GstPad:video: caps = video/x-h264, width=(int)640, height=(int)360, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1, codec_data=(buffer)014d4029ffe10018674d4029eca05017fcb8088000000300bb9aca00078c18cb01000468ebecb2, stream-format=(string)avc, alignment=(string)au, level=(string)4.1, profile=(string)main
/GstPipeline:pipeline0/GstFlvMux:mux.GstPad:src: caps = video/x-flv, streamheader=(buffer)< 464c5601050000000900000000, 120000f50000000000000002000a6f6e4d65746144617461080000000a000c766964656f636f646563696400401c000000000000000577696474680040840000000000000006686569676874004076800000000000000c417370656374526174696f58003ff0000000000000000c417370656374526174696f59003ff000000000000000096672616d657261746500403e000000000000000c617564696f636f6465636964004024000000000000000f6d6574616461746163726561746f720200134753747265616d657220464c56206d75786572000c6372656174696f6e6461746502001753756e204d617920352032303a35383a3539203230313300000900000100, 0900002c000000000000001700000000014d4029ffe10018674d4029eca05017fcb8088000000300bb9aca00078c18cb01000468ebecb200000037, 0800000200000000000000af000000000d >
/GstPipeline:pipeline0/GstRTMPSink:rtmpsink0.GstPad:sink: caps = video/x-flv, streamheader=(buffer)< 464c5601050000000900000000, 120000f50000000000000002000a6f6e4d65746144617461080000000a000c766964656f636f646563696400401c000000000000000577696474680040840000000000000006686569676874004076800000000000000c417370656374526174696f58003ff0000000000000000c417370656374526174696f59003ff000000000000000096672616d657261746500403e000000000000000c617564696f636f6465636964004024000000000000000f6d6574616461746163726561746f720200134753747265616d657220464c56206d75786572000c6372656174696f6e6461746502001753756e204d617920352032303a35383a3539203230313300000900000100, 0900002c000000000000001700000000014d4029ffe10018674d4029eca05017fcb8088000000300bb9aca00078c18cb01000468ebecb200000037, 0800000200000000000000af000000000d >
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
0:00:00.812604837 4391 0x1e590f0 DEBUG rtmpsink gstrtmpsink.c:235:gst_rtmp_sink_render:<rtmpsink0> Opened connection to rtmp://a.rtmp.youtube.com/live2/STREAMNAME_REMOVED<http://a.rtmp.youtube.com/live2/STREAMNAME_REMOVED>
0:00:00.812654112 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:241:gst_rtmp_sink_render:<rtmpsink0> Caching first buffer of size 13 for concatenation
0:00:00.812694629 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:249:gst_rtmp_sink_render:<rtmpsink0> Joining 2nd buffer of size 260 to cached buf
0:00:00.812722484 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 273 bytes to RTMP server
0:00:00.812778812 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 59 bytes to RTMP server
0:00:00.812813232 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 17 bytes to RTMP server
0:00:00.812894371 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 166 bytes to RTMP server
0:00:00.813448928 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 9302 bytes to RTMP server
0:00:00.815407311 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 132 bytes to RTMP server
0:00:00.815900534 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 130 bytes to RTMP server
0:00:00.816342378 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 129 bytes to RTMP server
0:00:00.816862090 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 136 bytes to RTMP server
0:00:00.817290072 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5841 bytes to RTMP server
0:00:00.818967597 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5849 bytes to RTMP server
0:00:00.820808038 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5858 bytes to RTMP server
0:00:00.822764003 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 131 bytes to RTMP server
0:00:00.823313489 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 132 bytes to RTMP server
0:00:00.823740494 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 129 bytes to RTMP server
0:00:00.824154593 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 133 bytes to RTMP server
0:00:00.824576933 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5753 bytes to RTMP server
0:00:00.852905074 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5846 bytes to RTMP server
0:00:00.854825476 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5741 bytes to RTMP server
0:00:00.856572691 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 136 bytes to RTMP server
0:00:00.857108289 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 136 bytes to RTMP server
0:00:00.857549728 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 139 bytes to RTMP server
0:00:00.857983149 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5847 bytes to RTMP server
0:00:00.859692554 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5768 bytes to RTMP server
0:00:00.861227906 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 139 bytes to RTMP server
0:00:00.861721182 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 149 bytes to RTMP server
0:00:00.862153646 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 146 bytes to RTMP server
0:00:00.862577417 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 145 bytes to RTMP server
0:00:00.863008600 4391 0x1e59050 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5799 bytes to RTMP server
0:00:00.864681394 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5791 bytes to RTMP server
0:00:00.872594409 4391 0x1e590f0 LOG rtmpsink gstrtmpsink.c:256:gst_rtmp_sink_render:<rtmpsink0> Sending 5753 bytes to RTMP server
ERROR: WriteN, RTMP send error 104 (140 bytes)
On Wed, Apr 24, 2013 at 3:50 PM, Chuck Crisler <ccrisler at mutualink.net<mailto:ccrisler at mutualink.net>> wrote:
Turn on logging to get more info. Logging can deluge you, so start slowly until you get enough info to narrow down. Start with something like 'export GST_DEBUG=*:3', which will give you a lot of messages. Then pick out the very few (1-2-3) elements that are interesting and set a higher debugging level for them (and disabling logging for everything else). Something like 'export GST_DEBUG=element1:4,element2:4'
Then post the logs if the answer isn't obvious.
On Wed, Apr 24, 2013 at 8:15 AM, Peter Maersk-Moller <pmaersk at gmail.com<mailto:pmaersk at gmail.com>> wrote:
Hi.
A little update on using GStreamer to generate a live stream for YouTube Live. Using the following information, the pipeline gets a little bit further.
.... ! flvmux streamable=true name=mux ! rtmpsink location="$LOCATION"
Here LOCATION is now defined as follows
LOCATION="Primary Server URL/Stream Name live=1 flashver=FME/3.0\20(compatible;\20FMSc\201.0) "
Primary Server URL and Stream Name is copied from the settings from the live event created for the YouTube account.
Nevertheless the script now fails with the following message after apparently setting up communication with the YouTube servers.
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: WriteN, RTMP send error 104 (126 bytes)
Anybody know what that is?
Best regards
On Mon, Apr 22, 2013 at 11:57 PM, Peter Maersk-Moller <pmaersk at gmail.com<mailto:pmaersk at gmail.com>> wrote:
Hi.
I was wondering if anybody has been successful streaming to the YouTube Live streaming servers using GStreamer?
I get the following error message which I believe indicates that YouTube doesn't accept my data:
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
ERROR: RTMP_ReadPacket, failed to read RTMP packet header
ERROR: from element /GstPipeline:pipeline0/GstRTMPSink:rtmpsink0: Could not open resource for writing.
Additional debug info:
gstrtmpsink.c(228): gst_rtmp_sink_render (): /GstPipeline:pipeline0 /GstRTMPSink:rtmpsink0:
Could not connect to RTMP stream "rtmp://a.rtmp.youtube.com/videolive?........<http://a.rtmp.youtube.com/videolive?........>..
I am using the following script that works great for UStream, but not for YouTube LIve. Anybody got any good suggestion?
Best regards
Peter
================
#!/bin/bash
if [ $# != 1 ] ; then exit ; fi
AUDIOFORMAT='audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int)44100, channels=(int)1'
case $1 in
you|youtube)
width=1280
height=720
framerate='30/1'
videoencoder="x264enc bitrate=2000 profile=main bframes=2"
videomode='video/x-h264, width=(int)1280, height=(int)720, framerate=(fraction)25/1, pixel-aspect-ratio=(fraction)1/1, profile=(string)main'
videomode='video/x-h264, profile=main'
audioencoder="faac bitrate=64000 profile=2"
location="rtmp://a.rtmp.youtube.com/videolive?signature=REMOVED_FOR<http://a.rtmp.youtube.com/videolive?signature=REMOVED_FOR> OBVIOUS_REASONS flashver=FME/3.0\20(compatible;\20FMSc\201.0)"
;;
ustream)
width=1024
height=576
framerate='25/1'
videoencoder="x264enc bitrate=800 bframes=0"
videomode='queue'
audioencoder="lame mode=3 bitrate=64"
location="rtmp://SOMETHING.fme.ustream.tv/ustreamVideo/SOMETHING/MORESOMETHING<http://SOMETHING.fme.ustream.tv/ustreamVideo/SOMETHING/MORESOMETHING>' flashver=FME/3.0\20(compatible;\20FMSc\201.0)'"
;;
*) echo 'Use youtube or ustream'
exit
esac
gst-launch -v videotestsrc !\
'video/x-raw-yuv, framerate='$framerate', width='$width', height='$height !\
ffmpegcolorspace !\
$videoencoder !\
"$videomode" !\
mux. audiotestsrc !\
$AUDIOFORMAT !\
$audioencoder !\
flvmux streamable=true name=mux !\
rtmpsink location="$location"
==================
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org<mailto:gstreamer-devel at lists.freedesktop.org>
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org<mailto:gstreamer-devel at lists.freedesktop.org>
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20130506/ab3c700c/attachment-0001.html>
More information about the gstreamer-devel
mailing list