Blazemeter / HLSPlugin

A repo to hold the OpenSource HLS JMeter Plugin code
Apache License 2.0
48 stars 17 forks source link

Owncast live stream cannot be parsed (v3.1) #29

Open micudaj opened 1 year ago

micudaj commented 1 year ago

When I use a URL from Owncast streaming server it cannot be parsed. I get the following error:

2023-01-24 09:24:10,621 ERROR o.a.j.t.JMeterThread: Error while processing sampler: 'bzm - Streaming Sampler'.
java.lang.NullPointerException: null
    at java.net.URI$Parser.parse(URI.java:3104) ~[?:?]
    at java.net.URI.<init>(URI.java:600) ~[?:?]
    at java.net.URI.create(URI.java:881) ~[?:?]
    at com.blazemeter.jmeter.videostreaming.hls.Playlist.buildAbsoluteUri(Playlist.java:117) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.videostreaming.hls.Playlist.lambda$getMediaSegments$1(Playlist.java:139) ~[jmeter-bzm-hls-3.1.jar:?]
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) ~[?:?]
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) ~[?:?]
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) ~[?:?]
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) ~[?:?]
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) ~[?:?]
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) ~[?:?]
    at com.blazemeter.jmeter.videostreaming.hls.Playlist.getMediaSegments(Playlist.java:140) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.videostreaming.hls.HlsSampler$MediaPlayback.updateMediaSegments(HlsSampler.java:116) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.videostreaming.hls.HlsSampler$MediaPlayback.<init>(HlsSampler.java:110) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.videostreaming.hls.HlsSampler$MediaPlayback.<init>(HlsSampler.java:100) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.videostreaming.hls.HlsSampler.sample(HlsSampler.java:59) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.videostreaming.core.VideoStreamingSampler.sample(VideoStreamingSampler.java:79) ~[jmeter-bzm-hls-3.1.jar:?]
    at com.blazemeter.jmeter.hls.logic.HlsSampler.sample(HlsSampler.java:212) ~[jmeter-bzm-hls-3.1.jar:?]
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1290) ~[ApacheJMeter_http.jar:5.5]
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:651) ~[ApacheJMeter_core.jar:5.5]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:570) ~[ApacheJMeter_core.jar:5.5]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.5]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.5]
    at java.lang.Thread.run(Thread.java:834) ~[?:?]
2023-01-24 09:24:10,628 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1
2023-01-24 09:24:10,628 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1

Example content of playlist file:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-MEDIA-SEQUENCE:19
#EXT-X-INDEPENDENT-SEGMENTS
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:44.269+0100
stream-qPvv4BTVR-19.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:46.269+0100
stream-qPvv4BTVR-20.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:48.269+0100
stream-qPvv4BTVR-21.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:50.269+0100
stream-qPvv4BTVR-22.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:52.269+0100
stream-qPvv4BTVR-23.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:54.269+0100
stream-qPvv4BTVR-24.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:56.269+0100
stream-qPvv4BTVR-25.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:24:58.269+0100
stream-qPvv4BTVR-26.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:00.269+0100
stream-qPvv4BTVR-27.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:02.269+0100
stream-qPvv4BTVR-28.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:04.269+0100
stream-qPvv4BTVR-29.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:06.269+0100
stream-qPvv4BTVR-30.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:08.269+0100
stream-qPvv4BTVR-31.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:10.269+0100
stream-qPvv4BTVR-32.ts
#EXTINF:2.000000,
#EXT-X-PROGRAM-DATE-TIME:2023-01-24T09:25:12.269+0100
stream-qPvv4BTVR-33.ts
RicardoPoleo commented 1 year ago

Hello @micudaj,

Thanks for taking the time to report this issue.

For us to properly address it, could you provide the following information:

  1. Which version of the Plugin are you using (I'm assuming V3.1)
  2. Which version of JMeter are you using
  3. What's the operative system you are testing the plugin on
  4. The URL that is producing this behavior
  5. Any particular configurations that we should be aware of?

If any of this information happens to contain sensitive data, you can always email me the details to one of our emails (rpoleo@perforce.com), and we will properly store and review it.

Hope to hear from you soon,

micudaj commented 1 year ago

Which version of the Plugin are you using (I'm assuming V3.1) --> 3.1 Which version of JMeter are you using --> 5.5 What's the operative system you are testing the plugin on --> Mac OS 12.6.2 The URL that is producing this behavior --> https://xyz.test.de/hls/2/stream.m3u8 (only internal resolvable) Any particular configurations that we should be aware of? --> none, was a default setup following https://www.blazemeter.com/blog/hls-plugin#how

RicardoPoleo commented 1 year ago

Do you know if this issue also happens with any of the public live streams of that platform?

So we can simulate it?

Kind regards,

micudaj commented 1 year ago

happens also on streams from the owncast directory: Go to https://owncast.online/ and scroll down for current streams.

e.g. https://live.retrostrange.com/hls/1/stream.m3u8

micudaj commented 1 year ago

I saw that hlsparserj is archived, maybe this is of interest for you: https://github.com/carlanton/m3u8-parser

micudaj commented 1 year ago

I think the problem is that hlsparserj is compliant with Version 12 of the Pantos spec, in which EXTINF tag MUST be followed by a media segment, but it in the released RFC this is no longer a MUST. https://www.rfc-editor.org/rfc/rfc8216#section-4.3.2.1