Opened 3 years ago

Last modified 3 years ago

#5011 new defect

ffmpeg native RTMP protocol implementation fails to parse app and playpath from some Wowza URIs

Reported by: irius Owned by:
Priority: normal Component: undetermined
Version: git-master Keywords: rtmp librtmp
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

I am trying to publish on a live RTMP publishing point (wowza) on the following URI:

rtmp://foo.bar.foo.barserver.net/foo-user-4-live01/_definst_/doPublish=abab2de0fe/hello
(** Please, note that I changed the real server address for security reasons.)

The problem is that if I compile ffmpeg WITHOUT support for librtmp (no -enable_librtmp flag) it doesn't work. However, when using librtmp it works.

Trying to figure out what was going on I found out the following:

  • Native ffmpeg RTMP and librtmp impementations parse in a different way the app and playpath from this URI. In particular, librtmp does it right and native implementations doesn't. Here are the details:
Native RTMP:
app= foo-user-4-live01/_definst_
fname= doPublish=abab2de0fe/hello

libRTMP:
app= foo-user-4-live01/_definst_/doPublish=abab2de0fe
fname= hello
  • Having a quick look at the source code, I wonder if it might be related to the "_definst_" thing in rtmpproto.c on the following function ?
static int do_llnw_auth(RTMPContext *rt, const char *user, const char *nonce)

Here you have the command line I am using and the output with verbose level for both native rtmp and librtmp versions:

NATIVE RTMP :

ffmpeg -i test.mp4 -f flv -v verbose rtmp://foo.bar.foo.barserver.net/foo-user-4-live01/_definst_/doPublish=abab2de0fe/hello
ffmpeg version 2.7 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (Rev5, Built by MSYS2 project)
  configuration: --disable-gpl --enable-shared --enable-libfdk-aac --target-os=mingw32 --disable-iconv --disable-zlib --disable-bzlib
  libavutil      54. 27.100 / 54. 27.100
  libavcodec     56. 41.100 / 56. 41.100
  libavformat    56. 36.100 / 56. 36.100
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 16.101 /  5. 16.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.100 /  1.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.26.101
  Duration: 01:02:54.64, start: 0.360000, bitrate: 4999 kb/s
    Stream #0:0(und): Video: h264 (High), 1 reference frame (avc1 / 0x31637661), yuv420p, 1920x1080 (1920x1088) [SAR 1:1 DAR 16:9], 4998 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
rtmp://foo.bar.foo.barserver.net/foo-user-4-live01/_definst_/doPublish=abab2de0fe/hello: Input/output error

LIBRTMP :

ffmpeg version N-71066-ga2dd2d7 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (GCC)
  configuration: --disable-static --enable-shared --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-lzma --enable-decklink --enable-zlib
  libavutil      54. 20.101 / 54. 20.101
  libavcodec     56. 29.100 / 56. 29.100
  libavformat    56. 26.101 / 56. 26.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 13.101 /  5. 13.101
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  1.100 /  1.  1.100
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.26.101
  Duration: 01:02:54.64, start: 0.360000, bitrate: 4999 kb/s
    Stream #0:0(und): Video: h264 (High), 1 reference frame (avc1 / 0x31637661), yuv420p, 1920x1080 (1920x1088) [SAR 1:1 DAR 16:9], 4998 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
    Metadata:
      handler_name    : VideoHandler
Parsing...
Parsed protocol: 0
Parsed host    : foo.bar.foo.barserver.net
Parsed app     : foo-user-4-live01/_definst_/doPublish=abab2de0fe
RTMP_Connect1, ... connected, handshaking
HandShake: Type Answer   : 03
HandShake: Server Uptime : 96850052
HandShake: FMS Version   : 3.0.1.1
HandShake: Handshaking finished....
RTMP_Connect1, handshaked
Invoking connect
HandleServerBW: server BW = 2500000
HandleClientBW: client BW = 2500000 2
HandleCtrl, received ctrl. type: 0, len: 6
HandleCtrl, Stream Begin 0
HandleChangeChunkSize, received: chunk size change to 512
RTMP_ClientPacket, received: invoke 261 bytes
(object begin)
Property: <Name:           no-name., STRING:    _result>
Property: <Name:           no-name., NUMBER:    1.00>
Property: <Name:           no-name., OBJECT>
(object begin)
Property: <Name:             fmsVer, STRING:    FMS/3,5,7,7009>
Property: <Name:       capabilities, NUMBER:    31.00>
Property: <Name:               mode, NUMBER:    1.00>
(object end)
Property: <Name:           no-name., OBJECT>
(object begin)
Property: <Name:              level, STRING:    status>
Property: <Name:               code, STRING:    NetConnection.Connect.Success>
Property: <Name:        description, STRING:    Connection succeeded.>
Property: <Name:               data, ECMA_ARRAY>
(object begin)
Property: <Name:            version, STRING:    3,5,7,7009>
(object end)
Property: <Name:           clientid, NUMBER:    1018124079.00>
Property: <Name:     objectEncoding, NUMBER:    0.00>
(object end)
(object end)
HandleInvoke, server invoking <_result>
HandleInvoke, received result for method call <connect>
Invoking releaseStream
Invoking FCPublish
Invoking createStream
RTMP_ClientPacket, received: invoke 141 bytes
(object begin)
Property: <Name:           no-name., STRING:    onFCPublish>
Property: <Name:           no-name., NUMBER:    0.00>
Property: NULL
Property: <Name:           no-name., OBJECT>
(object begin)
Property: <Name:              level, STRING:    status>
Property: <Name:               code, STRING:    NetStream.Publish.Start>
Property: <Name:        description, STRING:    FCPublish to stream barcelona.>
Property: <Name:           clientid, NUMBER:    1018124079.00>
(object end)
(object end)
HandleInvoke, server invoking <onFCPublish>
RTMP_ClientPacket, received: invoke 29 bytes
(object begin)
Property: <Name:           no-name., STRING:    _result>
Property: <Name:           no-name., NUMBER:    4.00>
Property: NULL
Property: <Name:           no-name., NUMBER:    1.00>
(object end)
HandleInvoke, server invoking <_result>
HandleInvoke, received result for method call <createStream>
Invoking publish
HandleCtrl, received ctrl. type: 0, len: 6
HandleCtrl, Stream Begin 1
RTMP_ClientPacket, received: invoke 129 bytes
(object begin)
Property: <Name:           no-name., STRING:    onStatus>
Property: <Name:           no-name., NUMBER:    0.00>
Property: NULL
Property: <Name:           no-name., OBJECT>
(object begin)
Property: <Name:              level, STRING:    status>
Property: <Name:               code, STRING:    NetStream.Publish.Start>
Property: <Name:        description, STRING:    Publishing barcelona.>
Property: <Name:           clientid, NUMBER:    1018124079.00>
(object end)
(object end)
HandleInvoke, server invoking <onStatus>
HandleInvoke, onStatus: NetStream.Publish.Start
[graph 0 input from stream 0:0 @ 0000000002341220] w:1920 h:1080 pixfmt:yuv420p tb:1/12800 fr:25/1 sar:1/1 sws_param:flags=2
Output #0, flv, to 'rtmp://foo.bar.foo.barserver.net/foo-user-4-live01/_definst_/doPublish=abab2de0fe/hello':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.26.101
    Stream #0:0(und): Video: flv1 (flv), 1 reference frame ([2][0][0][0] / 0x0002), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 25 fps, 1k tbn, 25 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      encoder         : Lavc56.29.100 flv
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> flv1 (flv))
Press [q] to stop, [?] for help

(....... I cut it here but it basically works)

Change History (2)

comment:1 Changed 3 years ago by cehoyos

Please confirm that the issue is reproducible with current FFmpeg git head.

comment:2 Changed 3 years ago by irius

Yes it is reproducible with current ffmpeg git head using the following compiler flags (probably any flags would work as long as you don't include librtmp):

--disable-gpl --enable-shared --enable-libfdk-aac --target-os=mingw32 --disable-iconv --disable-zlib --disable-bzlib
Note: See TracTickets for help on using tickets.