PLAYBACK_VIDEO_DECODING_ERROR 1301

An error occurred while trying to demux or decode the content.

This error can occur when the browser or device is unable to either demux or decode the content. This can have a multitude of reasons, but it is usually an indication of there either being an issue with the asset itself, or the player not properly supporting the provided stream.

Furthermore, this error can be thrown whenever the video element throws a MEDIA_ERR_DECODE, which is also an indication of there being an underlying issue with the provided stream.

Some recommendation to identify the root cause for this issue:

  • Ensure that there are no documented limitations for the used stream characteristics (e.g. codec, profile, bitrate, resolution, aspect ratio, frame rate, chroma subsampling, sampling rate, number of audio channels, etc.) on the respective platform

  • Ensure that the stream characteristics in the manifest match the actual stream data

  • Try playing the stream audio- or video-only, e.g. by removing the other mime type from the manifest, e.g. using the preprocessHttpResponse to narrow the demuxing/decoding issues down. You can also provide a changed version of the manifest which uses only one of the mime types instead of using the player configuration

    @example
    @Example Dash manifest
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <MPD id="f08e80da-bf1d-4e3d-8899-f0f6155f6efa" profiles="urn:mpeg:dash:profile:isoff-main:2011" type="static" availabilityStartTime="2015-08-04T09:33:14.000Z" publishTime="2015-08-04T10:47:32.000Z" mediaPresentationDuration="P0Y0M0DT0H3M30.000S" minBufferTime="P0Y0M0DT0H0M1.000S" bitmovin:version="1.6.0" xmlns:ns2="http://www.w3.org/1999/xlink" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:bitmovin="http://www.bitmovin.net/mpd/2015">
    <Period>
    <AdaptationSet mimeType="video/mp4" codecs="avc1.42c00d">
    <SegmentTemplate media="../video/$RepresentationID$/dash/segment_$Number$.m4s" initialization="../video/$RepresentationID$/dash/init.mp4" duration="100000" startNumber="0" timescale="25000"/>
    <Representation id="180_250000" bandwidth="250000" width="320" height="180" frameRate="25"/>
    <Representation id="270_400000" bandwidth="400000" width="480" height="270" frameRate="25"/>
    <Representation id="360_800000" bandwidth="800000" width="640" height="360" frameRate="25"/>
    <Representation id="540_1200000" bandwidth="1200000" width="960" height="540" frameRate="25"/>
    <Representation id="720_2400000" bandwidth="2400000" width="1280" height="720" frameRate="25"/>
    <Representation id="1080_4800000" bandwidth="4800000" width="1920" height="1080" frameRate="25"/>
    </AdaptationSet>
    <AdaptationSet lang="en" mimeType="audio/mp4" codecs="mp4a.40.2" bitmovin:label="English stereo">
    <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
    <SegmentTemplate media="../audio/$RepresentationID$/dash/segment_$Number$.m4s" initialization="../audio/$RepresentationID$/dash/init.mp4" duration="191472" startNumber="0" timescale="48000"/>
    <Representation id="1_stereo_128000" bandwidth="128000" audioSamplingRate="48000"/>
    </AdaptationSet>
    </Period>
    </MPD>
    @Example HLS manifest
    #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="English stereo",LANGUAGE="en",AUTOSELECT=YES,URI="f08e80da-bf1d-4e3d-8899-f0f6155f6efa_audio_1_stereo_128000.m3u8"
    #EXT-X-STREAM-INF:BANDWIDTH=628000,CODECS="avc1.42c00d,mp4a.40.2",RESOLUTION=320x180,AUDIO="audio"
    f08e80da-bf1d-4e3d-8899-f0f6155f6efa_video_180_250000.m3u8
    #EXT-X-STREAM-INF:BANDWIDTH=928000,CODECS="avc1.42c00d,mp4a.40.2",RESOLUTION=480x270,AUDIO="audio"
    f08e80da-bf1d-4e3d-8899-f0f6155f6efa_video_270_400000.m3u8
    var config = {
    network: {
    preprocessHttpResponse: function(type, response) {
    if (type === 'manifest/dash') {
    // Replace the video mp4 format with an unknown format, which the player does not recognize.
    // Likewise changing the audio/mp4 to an unknown format will force only video playback.
    // Refer to the manifest example above for the a structure we use for video and audio.
    response.body = response.body.replace('mimeType="video/mp4"', 'mimeType="unknown/no-format"');
    }

    if (type === 'manifest/hls/master') {
    // Replace all tags to remove any playback.
    response.body = response.body.replace(/(.*video.*)|(.*#EXT-X-STREAM-INF:BANDWIDTH=.*)/g, '');
    // Append a single stream tag to play only audio.
    // Refer to the example HLS manifest that we use in this case.
    response.body += '#EXT-X-STREAM-INF:BANDWIDTH=48708' + '\n' + 'f08e80da-bf1d-4e3d-8899-f0f6155f6efa_audio_1_stereo_128000.m3u8'
    }
    return Promise.resolve(response);
    }
    }
    }
  • Try playing back a single and fixed audio or video quality, e.g. using onVideoAdaptation or onAudioAdaptation, as the issue may occur only with a certain set of qualities (e.g. only the highest video quality)

    @example

    // Adapt based on needs - to only manipulate audio, only video or both at the same time.
    // This example forces both video and audio representations
    var config = {
    adaptation: {
    onVideoAdaptation: function(data) {
    // Force lowest quality for video
    return data.representations[0].id
    },
    onAudioAdaptation: function(data) {
    // Force highest quality for audio
    return data.representations[data.representations.length - 1].id
    },
    }
    }
  • Try using a stream validation tool to validate that there is no issue with the stream, e.g. the mediastreamvalidator for HLS streams

  • Try inspecting the chrome://media-internals in Chrome, as they can also provide additional and detailed information about stream demuxing or decoding issues

  • Try limiting the target buffer levels using the BufferConfig to reduce memory pressure and to avoid hitting potential hard limits for audio and video SourceBuffer sizes. Also consider enabling limitToPlayerSize.

    @example
    var config = {
    buffer: {
    video: {
    forwardduration: 12,
    backwardduration: 5,
    },
    audio: {
    forwardduration: 12,
    backwardduration: 5,
    },
    },
    adaptation: {
    limitToPlayerSize: true
    }
    }
  • If you are using Bitmovin Analytics, check the Session Log for additional information. Comparing the logs of multiple sessions for the same stream can help to identify patterns.

    For example, if the error usually occurs after the same amount of time in several sessions, this could indicate that the issue is related to a specific segment or event (e.g. period/discontinuity switch) at that time.