예제 #1
0
def test_create_a_variant_m3u8_with_iframe_with_video_range_playlists():
    variant_m3u8 = m3u8.M3U8()

    for vrange in ['SDR', 'PQ', 'HLG']:
        playlist = m3u8.Playlist(uri='video-%s.m3u8' % vrange,
                                 stream_info={
                                     'bandwidth': 3000000,
                                     'video_range': vrange
                                 },
                                 media=[],
                                 base_uri='http://example.com/%s' % vrange)
        iframe_playlist = m3u8.IFramePlaylist(
            uri='video-%s-iframes.m3u8' % vrange,
            iframe_stream_info={
                'bandwidth': 3000000,
                'video_range': vrange
            },
            base_uri='http://example.com/%s' % vrange)

        variant_m3u8.add_playlist(playlist)
        variant_m3u8.add_iframe_playlist(iframe_playlist)

    expected_content = """\
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=SDR
video-SDR.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=PQ
video-PQ.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=HLG
video-HLG.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=SDR,URI="video-SDR-iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=PQ,URI="video-PQ-iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,VIDEO-RANGE=HLG,URI="video-HLG-iframes.m3u8"
"""
    assert expected_content == variant_m3u8.dumps()
예제 #2
0
def test_create_a_variant_m3u8_with_iframe_with_hdcp_level_playlists():
    variant_m3u8 = m3u8.M3U8()

    for hdcplv in ['NONE', 'TYPE-0', 'TYPE-1']:
        playlist = m3u8.Playlist(
            uri='video-%s.m3u8' % hdcplv,
            stream_info={'bandwidth': 3000000,
                         'hdcp_level': hdcplv},
            media=[],
            base_uri='http://example.com/%s' % hdcplv
        )
        iframe_playlist = m3u8.IFramePlaylist(
            uri='video-%s-iframes.m3u8' % hdcplv,
            iframe_stream_info={'bandwidth': 3000000,
                                'hdcp_level': hdcplv},
            base_uri='http://example.com/%s' % hdcplv
        )

        variant_m3u8.add_playlist(playlist)
        variant_m3u8.add_iframe_playlist(iframe_playlist)

    expected_content = """\
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=NONE
video-NONE.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-0
video-TYPE-0.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-1
video-TYPE-1.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=NONE,URI="video-NONE-iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-0,URI="video-TYPE-0-iframes.m3u8"
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3000000,HDCP-LEVEL=TYPE-1,URI="video-TYPE-1-iframes.m3u8"
"""
    assert expected_content == variant_m3u8.dumps()
예제 #3
0
def create_iframe_playlist(playlist):
    """
    Creates a new I-frame playlist.
    """
    try:
        subprocess.check_output('ffprobe -version',
                                stderr=subprocess.STDOUT,
                                shell=True)
    except subprocess.CalledProcessError:
        raise DependencyError('FFmpeg not installed correctly')

    iframe_playlist = generate_m3u8_for_iframes()

    total_bytes = 0
    total_duration = 0

    try:
        stream = m3u8.load(playlist.absolute_uri)
    except IOError:
        raise PlaylistLoadError('Invalid stream url')
    except AttributeError:
        raise BadPlaylistError('Invalid playlist - no absolute uri')

    for segment in stream.segments:

        iframe_segments, s_bytes, s_duration = create_iframe_segments(segment)

        for iframe_segment in iframe_segments:
            iframe_playlist.add_segment(iframe_segment)

        total_bytes += s_bytes
        total_duration += s_duration

    if total_bytes != 0 and total_duration != 0:
        iframe_bandwidth = str(int(total_bytes / total_duration * 8))
    else:
        return (None, None)

    iframe_codecs = convert_codecs_for_iframes(playlist.stream_info.codecs)
    stream_info = {'bandwidth': iframe_bandwidth, 'codecs': iframe_codecs}
    iframe_playlist_uri = playlist.uri.replace('.m3u8', '-iframes.m3u8')

    new_iframe_playlist = m3u8.IFramePlaylist(base_uri=playlist.base_uri,
                                              uri=iframe_playlist_uri,
                                              iframe_stream_info=stream_info)

    return (new_iframe_playlist, {
        'uri': iframe_playlist_uri,
        'content': iframe_playlist.dumps()
    })
예제 #4
0
def test_create_a_variant_m3u8_with_iframe_with_average_bandwidth_playlists():
    variant_m3u8 = m3u8.M3U8()

    subtitles = m3u8.Media('english_sub.m3u8', 'SUBTITLES', 'subs', 'en',
                           'English', 'YES', 'YES', 'NO', None)
    variant_m3u8.add_media(subtitles)

    low_playlist = m3u8.Playlist(uri='video-800k.m3u8',
                                 stream_info={
                                     'bandwidth': 800000,
                                     'average_bandwidth': 555000,
                                     'resolution': '624x352',
                                     'codecs': 'avc1.4d001f, mp4a.40.5',
                                     'subtitles': 'subs'
                                 },
                                 media=[subtitles],
                                 base_uri='http://example.com/')
    low_iframe_playlist = m3u8.IFramePlaylist(uri='video-800k-iframes.m3u8',
                                              iframe_stream_info={
                                                  'bandwidth': 151288,
                                                  'average_bandwidth': 111000,
                                                  'resolution': '624x352',
                                                  'codecs': 'avc1.4d001f'
                                              },
                                              base_uri='http://example.com/')

    variant_m3u8.add_playlist(low_playlist)
    variant_m3u8.add_iframe_playlist(low_iframe_playlist)

    expected_content = """\
#EXTM3U
#EXT-X-MEDIA:URI="english_sub.m3u8",TYPE=SUBTITLES,GROUP-ID="subs",\
LANGUAGE="en",NAME="English",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO
#EXT-X-STREAM-INF:BANDWIDTH=800000,AVERAGE-BANDWIDTH=555000,\
RESOLUTION=624x352,CODECS="avc1.4d001f, mp4a.40.5",SUBTITLES="subs"
video-800k.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=151288,\
AVERAGE-BANDWIDTH=111000,RESOLUTION=624x352,CODECS="avc1.4d001f",\
URI="video-800k-iframes.m3u8"
"""
    assert expected_content == variant_m3u8.dumps()