HLS streaming from a Uniview IP camera

Hi

I'm trying to stream a H264 video feed that is coming from a uniview IP camera in a browser however the stream is just not displaying. Either I get a single frame or just a black screen. I get the same issues on safari on the mac or any browser on an iphone. However the video stream works just fine using hls.js in Windows or on Android.

We are grabbing the the RTSP stream from the camera and using ngix to serve the .m3u8 url. However even if we save the stream to a file and try an play it on the iphone it has the same issue (unless we use a separate media player like VLC).

I know if we use ffmpeg to reencode as H264 rather than copy it the it will play. My guess there is an incompatibility between how uniview encode the video and what apple can accept.

I've asked uniview and they are not sure what the problem is either.

Is there a way to get more debug information on why a particular HLS stream is failing in safari on mac or iPhone.

Just a minor update. I just discovered HTTP Live Streaming (HLS) Tools,

So I ran "Media Stream Validator" and found a few MUST fix errors in the report. However then reencoded the stream so it was playing and then ran the report gain. However I got the same MUST fix errors again plus an extra one. Although the reencoded video does play so I'm still not sure what the problem actually is.

I've attached the two reports if that helps.

    <h2 id="top">HLS Validation Report<span class="suffix"> (General, tvOS, iOS, macOS, visionOS, AirPlay 2)</span></h2>
    <p>Stream type: LIVE</p>
    <p><a href="https://livestream.dev.ps0.co/hls/install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e.m3u8">https://livestream.dev.ps0.co/hls/install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e.m3u8</a></p>
    <h3>Variant Overview</h3>
<table class="variants">
  <tbody><tr>
   <th class="agroup">Audio ID</th>
   <th class="center">#</th>
   <th>Max Rate</th>
   <th>% Diff.</th>
   <th>Avg Rate</th>
   <th>Resolution</th>
   <th>IDR Int.</th>
   <th>Framerate</th>
   <th>Codec</th>
   <th>Profile</th>
   <th>Level</th>
   <th>Encryption</th>
   <th>Avg Seg Count</th>
   <th>Avg PL Duration</th>
   <th>Audio Track Info</th>
  </tr>
  <tr>
    <td>NONE</td>
    <td class="center">1</td>
    <td>4415</td>
    <td>-</td>
    <td>4234</td>
    <td>1920 x 1080</td>
    <td>0.292</td>
    <td>25.000*</td>
    <td>AVC</td>
    <td>High</td>
    <td>4</td>
    <td>-</td>
    <td>7.00</td>
    <td>0:00:28</td>
    <td>AAC-LC, 2-CH</td>
  </tr>
</tbody></table>
    <p class="legend">Average duration processed: 0:00:48</p>
    <h3>Checked against <em>HLS Authoring Specification for Apple Devices</em></h3>
    <h2>General requirements</h2>
    <h3>Must Fix Issues</h3>
    <h4>1. The EXT-X-PROGRAM-DATE-TIME tag MUST be present in every live/linear media playlist</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>2. If EXT-X-INDEPENDENT-SEGMENTS is not in the multivariant playlist, then you MUST use the EXT-X-INDEPENDENT-SEGMENTS tag in all video media playlists</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>3. The server MUST deliver playlists using gzip content-encoding</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h3>Should Fix Issues</h3>
    <h4>4. Top-level playlist is not a multivariant playlist.</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>5. Audio data SHOULD be provided as an elementary audio stream or in fMP4</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>6. You SHOULD provide at least 15 minutes of content in a live/linear playlist</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>7. You SHOULD deliver video and audio as separate streams</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>8. You SHOULD support stream failover</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>9. Target durations SHOULD be 6 seconds.</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h2>Additional requirements for tvOS</h2>
    <h3>Should Fix Issues</h3>
    <h4>10. You SHOULD provide at least 120 minutes of content in a live/linear playlist</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h3>Report Information</h3>
<table>
  <tbody><tr>
    <td>MediaStreamValidator version:</td>
    <td class="left">1.23.14 (669.32b-240731)</td>
  </tr>
  <tr>
    <td>Report generator version:</td>
    <td class="left">1.23.14 (669.32b-240731)</td>
  </tr>
  <tr>
    <td>Report generation date:</td>
    <td class="left">09/19/24 19:38:37</td>
  </tr>
  <tr>
    <td>JSON format version:</td>
    <td class="left">1.2</td>
  </tr>
  <tr>
    <td>JSON data timestamp:</td>
    <td class="left">09/19/24 19:38:32</td>
  </tr>
</tbody></table>
<hr>
    <p class="legend">Note on tables: all bitrates are expressed in kb/s, IDs for default startup variants are highlighted in dark grey, entries annotated with an asterisk ('*') do not have a consistent value over the entire stream, entries in parentheses are from the multivariant playlist rather than media.</p>


{
  "mimeType" : "application\/vnd.apple.mpegurl",
  "processedSegmentsCount" : 12,
  "url" : "https:\/\/livestream.dev.ps0.co\/hls\/install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e.m3u8",
  "hasDiscSequenceTag" : false,
  "meanSegmentCount" : 7,
  "measuredMeanBitrate" : 4234184,
  "parsedSegmentsCount" : 12,
  "fetchCount" : 8,
  "sslHosts" : {
    "https:\/\/livestream.dev.ps0.co" : {
      "sslNegotiatedProtocolVersion" : 772,
      "sslNegotiatedCipher" : 4866,
      "sslRSAKeySizeInBits" : 2048
    }
  },
  "hasEndTag" : false,
  "validatorTimestamp" : "2024-09-19T19:38:32.843-07:00",
  "validatorVersion" : "1.23.14 (669.32b-240731)",
  "meanTotalDuration" : 28.02,
  "measuredMaxBitrate" : 4415469,
  "independentSegments" : false,
  "iframeOnly" : false,
  "playlistKind" : "media",
  "validatorName" : "mediastreamvalidator",
  "sslContentDeliveredSecurely" : true,
  "discontinuities" : [
    {
      "segments" : [
        {
          "segmentDurationTag" : 4.1600000000000001,
          "mediaSequence" : 92,
          "mimeType" : "video\/mp2t",
          "dataID" : 1,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-92.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "startTime" : 0.96299999999999997,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 93,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 2,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-93.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 5.1230000000000002,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 94,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 3,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-94.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 24.999999999999996,
          "startTime" : 9.1229999999999993,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 95,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 4,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-95.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 13.122999999999999,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 96,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 5,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-96.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 17.123000000000001,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 97,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 6,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-97.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 21.123000000000001,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 98,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 7,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-98.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 25.123000000000001,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 99,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 8,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-99.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 24.999999999999996,
          "startTime" : 29.123000000000001,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 100,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 9,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-100.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 33.122999999999998,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 101,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 10,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-101.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 37.122999999999998,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 102,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 11,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-102.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 41.122999999999998,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 103,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 12,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-103.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 45.122999999999998,
          "discontinuityDomain" : 1
        }
      ],
      "measurements" : {
        "measuredMaxBitrate" : 4415469,
        "measuredMeanBitrate" : 4234184,
        "measuredSegments" : 12
      },
      "tracks" : [
        {
          "trackVideoIDRStandardDeviation" : 0.55016751545548725,
          "trackId" : 1,
          "trackVideoWidth" : 1920,
          "trackVideoLevel" : 40,
          "trackVideoHeight" : 1080,
          "trackMediaType" : "vide",
          "trackVideoIDRInterval" : 0.29243902439024388,
          "trackVideoIsInterlaced" : false,
          "trackVideoProfile" : 100,
          "trackMediaSubType" : "avc1"
        },
        {
          "trackMediaType" : "soun",
          "trackAudioChannelCount" : 2,
          "trackId" : 2,
          "trackAudioSampleRate" : 44100,
          "trackMediaSubType" : "aac ",
          "trackAudioChannelLayout" : "Stereo (L R)"
        }
      ]
    }
  ],
  "playlistTargetDuration" : 4,
  "dataVersion" : 1.2,
  "gzipEncoded" : false,
  "dataID" : 0
}

{
  "mimeType" : "application\/vnd.apple.mpegurl",
  "processedSegmentsCount" : 8,
  "url" : "https:\/\/livestream.dev.ps0.co\/hls\/install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e.m3u8",
  "hasDiscSequenceTag" : false,
  "meanSegmentCount" : 7,
  "measuredMeanBitrate" : 5957122,
  "parsedSegmentsCount" : 8,
  "fetchCount" : 3,
  "sslHosts" : {
    "https:\/\/livestream.dev.ps0.co" : {
      "sslNegotiatedProtocolVersion" : 772,
      "sslNegotiatedCipher" : 4866,
      "sslRSAKeySizeInBits" : 2048
    }
  },
  "hasEndTag" : false,
  "validatorTimestamp" : "2024-09-19T19:40:52.152-07:00",
  "validatorVersion" : "1.23.14 (669.32b-240731)",
  "meanTotalDuration" : 35.731999999999999,
  "measuredMaxBitrate" : 8063094,
  "independentSegments" : false,
  "iframeOnly" : false,
  "playlistKind" : "media",
  "validatorName" : "mediastreamvalidator",
  "sslContentDeliveredSecurely" : true,
  "discontinuities" : [
    {
      "segments" : [
        {
          "mediaSequence" : 121,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 1,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-121.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 117.123,
          "discontinuityDomain" : 0
        },
        {
          "mediaSequence" : 122,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 2,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-122.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 121.123,
          "discontinuityDomain" : 0
        },
        {
          "mediaSequence" : 123,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 3,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-123.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 125.123,
          "discontinuityDomain" : 0
        },
        {
          "mediaSequence" : 124,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 4,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-124.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 24.999999999999996,
          "startTime" : 129.12299999999999,
          "discontinuityDomain" : 0
        },
        {
          "mediaSequence" : 125,
          "segmentDurationTag" : 4,
          "mimeType" : "video\/mp2t",
          "dataID" : 5,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-125.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 133.12299999999999,
          "discontinuityDomain" : 0
        },
        {
          "mediaSequence" : 126,
          "segmentDurationTag" : 3.7320000000000002,
          "mimeType" : "video\/mp2t",
          "dataID" : 6,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-126.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "format" : "transport",
          "audioStartsWithIPF" : true,
          "videoFrameRate" : 25,
          "startTime" : 137.12299999999999,
          "discontinuityDomain" : 0
        }
      ],
      "measurements" : {
        "measuredMaxBitrate" : 4252320,
        "measuredMeanBitrate" : 4229477,
        "measuredSegments" : 6
      },
      "tracks" : [
        {
          "trackVideoIDRStandardDeviation" : 0.43883121983989837,
          "trackId" : 1,
          "trackVideoWidth" : 1920,
          "trackVideoLevel" : 40,
          "trackVideoHeight" : 1080,
          "trackMediaType" : "vide",
          "trackVideoIDRInterval" : 0.26222222222222225,
          "trackVideoIsInterlaced" : false,
          "trackVideoProfile" : 100,
          "trackMediaSubType" : "avc1"
        },
        {
          "trackMediaType" : "soun",
          "trackAudioChannelCount" : 2,
          "trackId" : 2,
          "trackAudioSampleRate" : 44100,
          "trackMediaSubType" : "aac ",
          "trackAudioChannelLayout" : "Stereo (L R)"
        }
      ]
    },
    {
      "segments" : [
        {
          "mediaSequence" : 127,
          "segmentDurationTag" : 10,
          "mimeType" : "video\/mp2t",
          "dataID" : 7,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-127.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "presentationTime" : 0.96299999999999997,
          "audioStartsWithIPF" : true,
          "format" : "transport",
          "videoFrameRate" : 25,
          "startTime" : 0.88300000000000001,
          "discontinuityDomain" : 1
        },
        {
          "mediaSequence" : 128,
          "segmentDurationTag" : 10,
          "mimeType" : "video\/mp2t",
          "dataID" : 8,
          "url" : "install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e-128.ts",
          "segmentByteRangeLength" : 0,
          "videoStartsWithIDR" : true,
          "sslContentDeliveredSecurely" : true,
          "segmentByteRangeOffset" : 0,
          "presentationTime" : 10.962999999999999,
          "audioStartsWithIPF" : true,
          "format" : "transport",
          "videoFrameRate" : 25,
          "startTime" : 10.882999999999999,
          "discontinuityDomain" : 1
        }
      ],
      "measurements" : {
        "measuredMaxBitrate" : 8063094,
        "measuredMeanBitrate" : 8007145,
        "measuredSegments" : 2
      },
      "tracks" : [
        {
          "trackVideoIDRStandardDeviation" : 0,
          "trackId" : 1,
          "trackVideoWidth" : 1920,
          "trackVideoLevel" : 40,
          "trackVideoHeight" : 1080,
          "trackMediaType" : "vide",
          "trackVideoIDRInterval" : 10,
          "trackVideoIsInterlaced" : false,
          "trackVideoProfile" : 100,
          "trackMediaSubType" : "avc1"
        },
        {
          "trackMediaType" : "soun",
          "trackAudioChannelCount" : 2,
          "trackId" : 2,
          "trackAudioSampleRate" : 44100,
          "trackMediaSubType" : "aac ",
          "trackAudioChannelLayout" : "Stereo (L R)"
        }
      ]
    }
  ],
  "playlistTargetDuration" : 10,
  "dataVersion" : 1.2,
  "gzipEncoded" : false,
  "dataID" : 0
}

    <h2 id="top">HLS Validation Report<span class="suffix"> (General, tvOS, iOS, macOS, visionOS, AirPlay 2)</span></h2>
    <p>Stream type: LIVE</p>
    <p><a href="https://livestream.dev.ps0.co/hls/install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e.m3u8">https://livestream.dev.ps0.co/hls/install-34308-d71641bbce1b936b90498f657019ba691eb23cb7f8304d31ab81181a9fb5671e.m3u8</a></p>
    <h3>Variant Overview</h3>
<table class="variants">
  <tbody><tr>
   <th class="agroup">Audio ID</th>
   <th class="center">#</th>
   <th>Max Rate</th>
   <th>% Diff.</th>
   <th>Avg Rate</th>
   <th>Resolution</th>
   <th>IDR Int.</th>
   <th>Framerate</th>
   <th>Codec</th>
   <th>Profile</th>
   <th>Level</th>
   <th>Encryption</th>
   <th>Avg Seg Count</th>
   <th>Avg PL Duration</th>
   <th>Audio Track Info</th>
  </tr>
  <tr>
    <td>NONE</td>
    <td class="center">1</td>
    <td>8063</td>
    <td>-</td>
    <td>5957</td>
    <td>1920 x 1080</td>
    <td>4.715</td>
    <td>25.000</td>
    <td>AVC</td>
    <td>High</td>
    <td>4</td>
    <td>-</td>
    <td>7.00</td>
    <td>0:00:35</td>
    <td>AAC-LC, 2-CH</td>
  </tr>
</tbody></table>
    <p class="legend">Average duration processed: 0:00:43</p>
    <h3>Checked against <em>HLS Authoring Specification for Apple Devices</em></h3>
    <h2>General requirements</h2>
    <h3>Must Fix Issues</h3>
    <h4>1. The EXT-X-PROGRAM-DATE-TIME tag MUST be present in every live/linear media playlist</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>2. If live/linear content will ever contain an EXT-X-DISCONTINUITY tag then the EXT-X-DISCONTINUITY-SEQUENCE tag MUST always be present.</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>3. If EXT-X-INDEPENDENT-SEGMENTS is not in the multivariant playlist, then you MUST use the EXT-X-INDEPENDENT-SEGMENTS tag in all video media playlists</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>4. The server MUST deliver playlists using gzip content-encoding</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h3>Should Fix Issues</h3>
    <h4>5. Top-level playlist is not a multivariant playlist.</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>6. Audio data SHOULD be provided as an elementary audio stream or in fMP4</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>7. You SHOULD provide at least 15 minutes of content in a live/linear playlist</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>8. You SHOULD deliver video and audio as separate streams</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>9. You SHOULD support stream failover</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h4>10. Target durations SHOULD be 6 seconds.</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h2>Additional requirements for tvOS</h2>
    <h3>Should Fix Issues</h3>
    <h4>11. You SHOULD provide at least 120 minutes of content in a live/linear playlist</h4>
<ul style="list-style-type:disc">
<li>Variant #1</li>
</ul>
    <h3>Report Information</h3>
<table>
  <tbody><tr>
    <td>MediaStreamValidator version:</td>
    <td class="left">1.23.14 (669.32b-240731)</td>
  </tr>
  <tr>
    <td>Report generator version:</td>
    <td class="left">1.23.14 (669.32b-240731)</td>
  </tr>
  <tr>
    <td>Report generation date:</td>
    <td class="left">09/19/24 19:41:04</td>
  </tr>
  <tr>
    <td>JSON format version:</td>
    <td class="left">1.2</td>
  </tr>
  <tr>
    <td>JSON data timestamp:</td>
    <td class="left">09/19/24 19:40:52</td>
  </tr>
</tbody></table>
<hr>
    <p class="legend">Note on tables: all bitrates are expressed in kb/s, IDs for default startup variants are highlighted in dark grey, entries annotated with an asterisk ('*') do not have a consistent value over the entire stream, entries in parentheses are from the multivariant playlist rather than media.</p>


HLS streaming from a Uniview IP camera
 
 
Q