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