Update end to end packager_test with multiple inputs
- Also set --clear_lead to 1 if encryption is enabled to make sure some of the segments are encrypted. - Also fixed glint errors. Change-Id: Ie92ad3ea1a3fd95d059e424a114b863ac393e6bf
This commit is contained in:
parent
f88e04a1bb
commit
6ca2ea9a24
|
@ -5,10 +5,8 @@
|
||||||
# Use of this source code is governed by a BSD-style
|
# Use of this source code is governed by a BSD-style
|
||||||
# license that can be found in the LICENSE file or at
|
# license that can be found in the LICENSE file or at
|
||||||
# https://developers.google.com/open-source/licenses/bsd
|
# https://developers.google.com/open-source/licenses/bsd
|
||||||
|
|
||||||
"""Tests utilizing the sample packager binary."""
|
"""Tests utilizing the sample packager binary."""
|
||||||
|
|
||||||
|
|
||||||
import filecmp
|
import filecmp
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
@ -26,6 +24,10 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packager = packager_app.PackagerApp()
|
self.packager = packager_app.PackagerApp()
|
||||||
self.tmp_dir = tempfile.mkdtemp()
|
self.tmp_dir = tempfile.mkdtemp()
|
||||||
|
self.test_data_dir = os.path.join(test_env.SRC_DIR, 'packager', 'media',
|
||||||
|
'test', 'data')
|
||||||
|
self.golden_file_dir = os.path.join(test_env.SRC_DIR, 'packager', 'app',
|
||||||
|
'test', 'testdata')
|
||||||
self.output_prefix = os.path.join(self.tmp_dir, 'output')
|
self.output_prefix = os.path.join(self.tmp_dir, 'output')
|
||||||
self.mpd_output = self.output_prefix + '.mpd'
|
self.mpd_output = self.output_prefix + '.mpd'
|
||||||
self.output = None
|
self.output = None
|
||||||
|
@ -37,9 +39,8 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self.assertEqual(0, self.packager.BuildSrc())
|
self.assertEqual(0, self.packager.BuildSrc())
|
||||||
|
|
||||||
def testDumpStreamInfo(self):
|
def testDumpStreamInfo(self):
|
||||||
input = os.path.join(test_env.SRC_DIR, 'packager', 'media', 'test', 'data',
|
test_file = os.path.join(self.test_data_dir, 'bear-640x360.mp4')
|
||||||
'bear-640x360.mp4')
|
stream_info = self.packager.DumpStreamInfo(test_file)
|
||||||
stream_info = self.packager.DumpStreamInfo(input)
|
|
||||||
expected_stream_info = ('Found 2 stream(s).\n'
|
expected_stream_info = ('Found 2 stream(s).\n'
|
||||||
'Stream [0] type: Video\n'
|
'Stream [0] type: Video\n'
|
||||||
' codec_string: avc1.64001e\n'
|
' codec_string: avc1.64001e\n'
|
||||||
|
@ -63,7 +64,7 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
' sampling_frequency: 44100\n'
|
' sampling_frequency: 44100\n'
|
||||||
' language: und\n')
|
' language: und\n')
|
||||||
self.assertIn(expected_stream_info, stream_info,
|
self.assertIn(expected_stream_info, stream_info,
|
||||||
"\nExpecting: \n %s\n\nBut seeing: \n%s" % (
|
'\nExpecting: \n %s\n\nBut seeing: \n%s' % (
|
||||||
expected_stream_info, stream_info))
|
expected_stream_info, stream_info))
|
||||||
|
|
||||||
def testPackageFirstStream(self):
|
def testPackageFirstStream(self):
|
||||||
|
@ -72,15 +73,17 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-v-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-v-golden.mpd')
|
||||||
|
|
||||||
def testPackageText(self):
|
def testPackageText(self):
|
||||||
self.packager.Package(self._GetStreams(['text'],
|
self.packager.Package(
|
||||||
test_file='subtitle-english.vtt'),
|
self._GetStreams(['text'],
|
||||||
|
test_files=['subtitle-english.vtt']),
|
||||||
self._GetFlags())
|
self._GetFlags())
|
||||||
self._DiffGold(self.output[0], 'subtitle-english-golden.vtt')
|
self._DiffGold(self.output[0], 'subtitle-english-golden.vtt')
|
||||||
self._DiffGold(self.mpd_output, 'subtitle-english-vtt-golden.mpd')
|
self._DiffGold(self.mpd_output, 'subtitle-english-vtt-golden.mpd')
|
||||||
|
|
||||||
# Probably one of the most common scenarios is to package audio and video.
|
# Probably one of the most common scenarios is to package audio and video.
|
||||||
def testPackageAudioVideo(self):
|
def testPackageAudioVideo(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video']), self._GetFlags())
|
self.packager.Package(
|
||||||
|
self._GetStreams(['audio', 'video']), self._GetFlags())
|
||||||
self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4')
|
self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4')
|
||||||
self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4')
|
self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4')
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-av-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-av-golden.mpd')
|
||||||
|
@ -88,7 +91,8 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
# Package all video, audio, and text.
|
# Package all video, audio, and text.
|
||||||
def testPackageVideoAudioText(self):
|
def testPackageVideoAudioText(self):
|
||||||
audio_video_streams = self._GetStreams(['audio', 'video'])
|
audio_video_streams = self._GetStreams(['audio', 'video'])
|
||||||
text_stream = self._GetStreams(['text'], test_file='subtitle-english.vtt')
|
text_stream = self._GetStreams(['text'],
|
||||||
|
test_files=['subtitle-english.vtt'])
|
||||||
self.packager.Package(audio_video_streams + text_stream, self._GetFlags())
|
self.packager.Package(audio_video_streams + text_stream, self._GetFlags())
|
||||||
self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4')
|
self._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4')
|
||||||
self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4')
|
self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4')
|
||||||
|
@ -96,54 +100,63 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-avt-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-avt-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithEncryption(self):
|
def testPackageWithEncryption(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video']),
|
self.packager.Package(
|
||||||
|
self._GetStreams(['audio', 'video']),
|
||||||
self._GetFlags(encryption=True))
|
self._GetFlags(encryption=True))
|
||||||
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
|
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
|
||||||
self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
|
self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
|
||||||
|
|
||||||
def testPackageHevcWithEncryption(self):
|
def testPackageHevcWithEncryption(self):
|
||||||
self.packager.Package(self._GetStreams(['video'],
|
self.packager.Package(
|
||||||
test_file='bear-640x360-hevc.mp4'),
|
self._GetStreams(['video'],
|
||||||
|
test_files=['bear-640x360-hevc.mp4']),
|
||||||
self._GetFlags(encryption=True))
|
self._GetFlags(encryption=True))
|
||||||
self._DiffGold(self.output[0], 'bear-640x360-hevc-v-cenc-golden.mp4')
|
self._DiffGold(self.output[0], 'bear-640x360-hevc-v-cenc-golden.mp4')
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-hevc-v-cenc-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-hevc-v-cenc-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithEncryptionAndRandomIv(self):
|
def testPackageWithEncryptionAndRandomIv(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video']),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, random_iv=True))
|
self._GetStreams(['audio', 'video']),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
random_iv=True))
|
||||||
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
|
||||||
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
||||||
# The outputs are encrypted with random iv, so they are not the same as
|
# The outputs are encrypted with random iv, so they are not the same as
|
||||||
# golden files.
|
# golden files.
|
||||||
self.assertFalse(self._CompareWithGold(
|
self.assertFalse(self._CompareWithGold(self.output[0],
|
||||||
self.output[0], 'bear-640x360-a-cenc-golden.mp4'))
|
'bear-640x360-a-cenc-golden.mp4'))
|
||||||
self.assertFalse(self._CompareWithGold(
|
self.assertFalse(self._CompareWithGold(self.output[1],
|
||||||
self.output[1], 'bear-640x360-v-cenc-golden.mp4'))
|
'bear-640x360-v-cenc-golden.mp4'))
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithEncryptionAndRealClock(self):
|
def testPackageWithEncryptionAndRealClock(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video']),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, use_fake_clock=False))
|
self._GetStreams(['audio', 'video']),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
use_fake_clock=False))
|
||||||
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
|
||||||
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
||||||
# The outputs are generated with real clock, so they are not the same as
|
# The outputs are generated with real clock, so they are not the same as
|
||||||
# golden files.
|
# golden files.
|
||||||
self.assertFalse(self._CompareWithGold(
|
self.assertFalse(self._CompareWithGold(self.output[0],
|
||||||
self.output[0], 'bear-640x360-a-cenc-golden.mp4'))
|
'bear-640x360-a-cenc-golden.mp4'))
|
||||||
self.assertFalse(self._CompareWithGold(
|
self.assertFalse(self._CompareWithGold(self.output[1],
|
||||||
self.output[1], 'bear-640x360-v-cenc-golden.mp4'))
|
'bear-640x360-v-cenc-golden.mp4'))
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithEncryptionAndDashIfIop(self):
|
def testPackageWithEncryptionAndDashIfIop(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video']),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, dash_if_iop=True))
|
self._GetStreams(['audio', 'video']),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
dash_if_iop=True))
|
||||||
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
|
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
|
||||||
self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
|
self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
|
||||||
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-iop-golden.mpd')
|
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-iop-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithEncryptionAndOutputMediaInfo(self):
|
def testPackageWithEncryptionAndOutputMediaInfo(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video']),
|
self.packager.Package(
|
||||||
|
self._GetStreams(['audio', 'video']),
|
||||||
self._GetFlags(encryption=True,
|
self._GetFlags(encryption=True,
|
||||||
output_media_info=True))
|
output_media_info=True))
|
||||||
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
|
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
|
||||||
|
@ -152,32 +165,63 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self._DiffMediaInfoGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
|
self._DiffMediaInfoGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
|
||||||
|
|
||||||
def testPackageWithLiveProfile(self):
|
def testPackageWithLiveProfile(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
|
self.packager.Package(
|
||||||
|
self._GetStreams(
|
||||||
|
['audio', 'video'],
|
||||||
|
live=True),
|
||||||
self._GetFlags(live=True))
|
self._GetFlags(live=True))
|
||||||
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-golden')
|
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-golden')
|
||||||
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-golden')
|
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-golden')
|
||||||
self._DiffLiveMpdGold(self.mpd_output, 'bear-640x360-av-live-golden.mpd')
|
self._DiffLiveMpdGold(self.mpd_output, 'bear-640x360-av-live-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithLiveProfileAndEncryption(self):
|
def testPackageWithLiveProfileAndEncryption(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, live=True))
|
self._GetStreams(
|
||||||
|
['audio', 'video'],
|
||||||
|
live=True),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
live=True))
|
||||||
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-cenc-golden')
|
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-cenc-golden')
|
||||||
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-cenc-golden')
|
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-cenc-golden')
|
||||||
self._DiffLiveMpdGold(self.mpd_output,
|
self._DiffLiveMpdGold(self.mpd_output,
|
||||||
'bear-640x360-av-live-cenc-golden.mpd')
|
'bear-640x360-av-live-cenc-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithLiveProfileAndEncryptionAndDashIfIop(self):
|
def testPackageWithLiveProfileAndEncryptionAndDashIfIop(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, live=True,
|
self._GetStreams(
|
||||||
|
['audio', 'video'],
|
||||||
|
live=True),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
live=True,
|
||||||
dash_if_iop=True))
|
dash_if_iop=True))
|
||||||
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-cenc-golden')
|
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-cenc-golden')
|
||||||
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-cenc-golden')
|
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-cenc-golden')
|
||||||
self._DiffLiveMpdGold(self.mpd_output,
|
self._DiffLiveMpdGold(self.mpd_output,
|
||||||
'bear-640x360-av-live-cenc-iop-golden.mpd')
|
'bear-640x360-av-live-cenc-iop-golden.mpd')
|
||||||
|
|
||||||
|
def testPackageWithLiveProfileAndEncryptionAndDashIfIopWithMultFiles(self):
|
||||||
|
self.packager.Package(
|
||||||
|
self._GetStreams(
|
||||||
|
['audio', 'video'],
|
||||||
|
live=True,
|
||||||
|
test_files=['bear-1280x720.mp4', 'bear-640x360.mp4',
|
||||||
|
'bear-320x180.mp4']),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
live=True,
|
||||||
|
dash_if_iop=True))
|
||||||
|
self._DiffLiveGold(self.output[2], 'bear-640x360-a-live-cenc-golden')
|
||||||
|
self._DiffLiveGold(self.output[3], 'bear-640x360-v-live-cenc-golden')
|
||||||
|
# Mpd cannot be validated right now since we don't generate determinstic
|
||||||
|
# mpd with multiple inputs due to thread racing.
|
||||||
|
# TODO(kqyang): Generate determinstic mpd or at least validate mpd schema.
|
||||||
|
|
||||||
def testPackageWithLiveProfileAndKeyRotation(self):
|
def testPackageWithLiveProfileAndKeyRotation(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, key_rotation=True,
|
self._GetStreams(
|
||||||
|
['audio', 'video'],
|
||||||
|
live=True),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
key_rotation=True,
|
||||||
live=True))
|
live=True))
|
||||||
self._DiffLiveGold(self.output[0],
|
self._DiffLiveGold(self.output[0],
|
||||||
'bear-640x360-a-live-cenc-rotation-golden')
|
'bear-640x360-a-live-cenc-rotation-golden')
|
||||||
|
@ -187,9 +231,14 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
'bear-640x360-av-live-cenc-rotation-golden.mpd')
|
'bear-640x360-av-live-cenc-rotation-golden.mpd')
|
||||||
|
|
||||||
def testPackageWithLiveProfileAndKeyRotationAndDashIfIop(self):
|
def testPackageWithLiveProfileAndKeyRotationAndDashIfIop(self):
|
||||||
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
|
self.packager.Package(
|
||||||
self._GetFlags(encryption=True, key_rotation=True,
|
self._GetStreams(
|
||||||
live=True, dash_if_iop=True))
|
['audio', 'video'],
|
||||||
|
live=True),
|
||||||
|
self._GetFlags(encryption=True,
|
||||||
|
key_rotation=True,
|
||||||
|
live=True,
|
||||||
|
dash_if_iop=True))
|
||||||
self._DiffLiveGold(self.output[0],
|
self._DiffLiveGold(self.output[0],
|
||||||
'bear-640x360-a-live-cenc-rotation-golden')
|
'bear-640x360-a-live-cenc-rotation-golden')
|
||||||
self._DiffLiveGold(self.output[1],
|
self._DiffLiveGold(self.output[1],
|
||||||
|
@ -223,57 +272,67 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
|
||||||
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
|
||||||
|
|
||||||
def _GetStreams(self, stream_descriptors, live = False,
|
def _GetStreams(self, stream_descriptors, live=False, test_files=None):
|
||||||
test_file = 'bear-640x360.mp4'):
|
if test_files is None:
|
||||||
|
test_files = ['bear-640x360.mp4']
|
||||||
streams = []
|
streams = []
|
||||||
if not self.output:
|
if not self.output:
|
||||||
self.output = []
|
self.output = []
|
||||||
|
|
||||||
test_data_dir = os.path.join(
|
for test_file_index, test_file_name in enumerate(test_files):
|
||||||
test_env.SRC_DIR, 'packager', 'media', 'test', 'data')
|
test_file = os.path.join(self.test_data_dir, test_file_name)
|
||||||
input = os.path.join(test_data_dir, test_file)
|
|
||||||
for stream_descriptor in stream_descriptors:
|
for stream_descriptor in stream_descriptors:
|
||||||
if live:
|
if len(test_files) == 1:
|
||||||
# This is still output prefix actually.
|
output_prefix = '%s_%s' % (self.output_prefix, stream_descriptor)
|
||||||
output = '%s_%s' % (self.output_prefix, stream_descriptor)
|
|
||||||
stream = ('input=%s,stream=%s,init_segment=%s-init.mp4,' +
|
|
||||||
'segment_template=%s-$Number$.m4s')
|
|
||||||
streams.append(stream % (input, stream_descriptor, output, output))
|
|
||||||
else:
|
else:
|
||||||
output = '%s_%s.%s' % (self.output_prefix,
|
output_prefix = '%s_%d_%s' % (self.output_prefix, test_file_index,
|
||||||
stream_descriptor,
|
stream_descriptor)
|
||||||
|
if live:
|
||||||
|
stream = ('input=%s,stream=%s,init_segment=%s-init.mp4,'
|
||||||
|
'segment_template=%s-$Number$.m4s')
|
||||||
|
streams.append(stream % (test_file, stream_descriptor, output_prefix,
|
||||||
|
output_prefix))
|
||||||
|
self.output.append(output_prefix)
|
||||||
|
else:
|
||||||
|
output = '%s.%s' % (output_prefix,
|
||||||
self._GetExtension(stream_descriptor))
|
self._GetExtension(stream_descriptor))
|
||||||
stream = 'input=%s,stream=%s,output=%s'
|
stream = 'input=%s,stream=%s,output=%s'
|
||||||
streams.append(stream % (input, stream_descriptor, output))
|
streams.append(stream % (test_file, stream_descriptor, output))
|
||||||
self.output.append(output)
|
self.output.append(output)
|
||||||
return streams
|
return streams
|
||||||
|
|
||||||
def _GetExtension(self, stream_descriptor):
|
def _GetExtension(self, stream_descriptor):
|
||||||
# TODO(rkuroiwa): Support ttml.
|
# TODO(rkuroiwa): Support ttml.
|
||||||
if stream_descriptor == "text":
|
if stream_descriptor == 'text':
|
||||||
return "vtt"
|
return 'vtt'
|
||||||
return "mp4"
|
return 'mp4'
|
||||||
|
|
||||||
def _GetFlags(self, encryption = False, random_iv = False,
|
def _GetFlags(self,
|
||||||
widevine_encryption = False, key_rotation = False,
|
encryption=False,
|
||||||
live = False, dash_if_iop=False, output_media_info = False,
|
random_iv=False,
|
||||||
|
widevine_encryption=False,
|
||||||
|
key_rotation=False,
|
||||||
|
live=False,
|
||||||
|
dash_if_iop=False,
|
||||||
|
output_media_info=False,
|
||||||
use_fake_clock=True):
|
use_fake_clock=True):
|
||||||
flags = []
|
flags = []
|
||||||
if widevine_encryption:
|
if widevine_encryption:
|
||||||
widevine_server_url = ('https://license.uat.widevine.com/cenc' +
|
widevine_server_url = ('https://license.uat.widevine.com/cenc'
|
||||||
'/getcontentkey/widevine_test')
|
'/getcontentkey/widevine_test')
|
||||||
flags += ['--enable_widevine_encryption',
|
flags += ['--enable_widevine_encryption',
|
||||||
'--key_server_url=' + widevine_server_url,
|
'--key_server_url=' + widevine_server_url,
|
||||||
'--content_id=3031323334353637',
|
'--content_id=3031323334353637', '--signer=widevine_test']
|
||||||
'--signer=widevine_test']
|
|
||||||
elif encryption:
|
elif encryption:
|
||||||
flags += ['--enable_fixed_key_encryption',
|
flags += ['--enable_fixed_key_encryption',
|
||||||
'--key_id=31323334353637383930313233343536',
|
'--key_id=31323334353637383930313233343536',
|
||||||
'--key=32333435363738393021323334353637',
|
'--key=32333435363738393021323334353637',
|
||||||
'--pssh=31323334353637383930313233343536']
|
'--pssh=31323334353637383930313233343536',
|
||||||
|
'--clear_lead=1']
|
||||||
if not random_iv:
|
if not random_iv:
|
||||||
flags.append('--iv=33343536373839303132333435363738')
|
flags.append('--iv=3334353637383930')
|
||||||
if key_rotation: flags.append('--crypto_period_duration=1')
|
if key_rotation:
|
||||||
|
flags.append('--crypto_period_duration=1')
|
||||||
|
|
||||||
if live:
|
if live:
|
||||||
flags.append('--profile=live')
|
flags.append('--profile=live')
|
||||||
|
@ -287,28 +346,27 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
flags.append('--segment_duration=1')
|
flags.append('--segment_duration=1')
|
||||||
# Use fake clock, so output can be compared.
|
# Use fake clock, so output can be compared.
|
||||||
if use_fake_clock:
|
if use_fake_clock:
|
||||||
flags.append("--use_fake_clock_for_muxer")
|
flags.append('--use_fake_clock_for_muxer')
|
||||||
return flags
|
return flags
|
||||||
|
|
||||||
def _CompareWithGold(self, test_output, golden_file_name):
|
def _CompareWithGold(self, test_output, golden_file_name):
|
||||||
golden_file = os.path.join(test_env.SRC_DIR, 'packager', 'app', 'test',
|
golden_file = os.path.join(self.golden_file_dir, golden_file_name)
|
||||||
'testdata', golden_file_name)
|
|
||||||
return filecmp.cmp(test_output, golden_file)
|
return filecmp.cmp(test_output, golden_file)
|
||||||
|
|
||||||
def _DiffGold(self, test_output, golden_file_name):
|
def _DiffGold(self, test_output, golden_file_name):
|
||||||
golden_file = os.path.join(test_env.SRC_DIR, 'packager', 'app', 'test',
|
golden_file = os.path.join(self.golden_file_dir, golden_file_name)
|
||||||
'testdata', golden_file_name)
|
|
||||||
if test_env.options.test_update_golden_files:
|
if test_env.options.test_update_golden_files:
|
||||||
if not filecmp.cmp(test_output, golden_file):
|
if not filecmp.cmp(test_output, golden_file):
|
||||||
print "Updating golden file: ", golden_file_name
|
print 'Updating golden file: ', golden_file_name
|
||||||
shutil.copyfile(test_output, golden_file)
|
shutil.copyfile(test_output, golden_file)
|
||||||
else:
|
else:
|
||||||
match = filecmp.cmp(test_output, golden_file)
|
match = filecmp.cmp(test_output, golden_file)
|
||||||
if not match:
|
if not match:
|
||||||
p = subprocess.Popen(['git', '--no-pager', 'diff', '--color=auto',
|
p = subprocess.Popen(
|
||||||
'--no-ext-diff', '--no-index',
|
['git', '--no-pager', 'diff', '--color=auto', '--no-ext-diff',
|
||||||
golden_file, test_output],
|
'--no-index', golden_file, test_output],
|
||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE)
|
||||||
output, error = p.communicate()
|
output, error = p.communicate()
|
||||||
self.fail(output + error)
|
self.fail(output + error)
|
||||||
|
|
||||||
|
@ -339,10 +397,10 @@ class PackagerAppTest(unittest.TestCase):
|
||||||
# Extract availabilityStartTime
|
# Extract availabilityStartTime
|
||||||
m = re.search('(?<=availabilityStartTime=")[^"]+', content)
|
m = re.search('(?<=availabilityStartTime=")[^"]+', content)
|
||||||
self.assertIsNotNone(m)
|
self.assertIsNotNone(m)
|
||||||
availabilityStartTime = m.group(0)
|
availability_start_time = m.group(0)
|
||||||
print 'availabilityStartTime: ', availabilityStartTime
|
print 'availabilityStartTime: ', availability_start_time
|
||||||
with open(test_output, 'w') as f:
|
with open(test_output, 'w') as f:
|
||||||
f.write(content.replace(availabilityStartTime, 'place_holder'))
|
f.write(content.replace(availability_start_time, 'place_holder'))
|
||||||
self._DiffGold(test_output, golden_file_name)
|
self._DiffGold(test_output, golden_file_name)
|
||||||
|
|
||||||
def _AssertStreamInfo(self, stream, info):
|
def _AssertStreamInfo(self, stream, info):
|
||||||
|
|
|
@ -39,7 +39,7 @@ parser.add_argument('--test_update_golden_files', default=0, type=int)
|
||||||
options, args = parser.parse_known_args()
|
options, args = parser.parse_known_args()
|
||||||
sys.argv[1:] = args
|
sys.argv[1:] = args
|
||||||
has_aes_flags = False
|
has_aes_flags = False
|
||||||
if (options.aes_signing_key and options.aes_signing_iv):
|
if options.aes_signing_key and options.aes_signing_iv:
|
||||||
has_aes_flags = True
|
has_aes_flags = True
|
||||||
has_rsa_flags = False
|
has_rsa_flags = False
|
||||||
if options.rsa_signing_key_path:
|
if options.rsa_signing_key_path:
|
||||||
|
|
Binary file not shown.
|
@ -1,4 +1,4 @@
|
||||||
bandwidth: 126684
|
bandwidth: 128635
|
||||||
audio_info {
|
audio_info {
|
||||||
codec: "mp4a.40.2"
|
codec: "mp4a.40.2"
|
||||||
sampling_frequency: 44100
|
sampling_frequency: 44100
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -2,7 +2,7 @@
|
||||||
<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT2S" type="static" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" mediaPresentationDuration="PT2.763174533843994S">
|
<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT2S" type="static" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011" mediaPresentationDuration="PT2.763174533843994S">
|
||||||
<Period>
|
<Period>
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subSegmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" subSegmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="882409" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
<Representation id="0" bandwidth="885058" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" subSegmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" subSegmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="126684" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="128635" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="882409" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
<Representation id="0" bandwidth="885058" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
||||||
<BaseURL>output_video.mp4</BaseURL>
|
<BaseURL>output_video.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="941-1008" timescale="30000">
|
<SegmentBase indexRange="941-1008" timescale="30000">
|
||||||
<Initialization range="0-940"/>
|
<Initialization range="0-940"/>
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="126684" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="128635" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<BaseURL>output_audio.mp4</BaseURL>
|
<BaseURL>output_audio.mp4</BaseURL>
|
||||||
<SegmentBase indexRange="817-884" timescale="44100">
|
<SegmentBase indexRange="817-884" timescale="44100">
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
||||||
<Period start="PT0S">
|
<Period start="PT0S">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="872999" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
<Representation id="0" bandwidth="875528" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="121855" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="124085" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="31323334-3536-3738-3930-313233343536"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="0" bandwidth="872999" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
<Representation id="0" bandwidth="875528" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="2002" d="30030" r="1"/>
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
|
||||||
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
|
||||||
</ContentProtection>
|
</ContentProtection>
|
||||||
<Representation id="1" bandwidth="121855" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="124085" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
<MPD xmlns="urn:mpeg:DASH:schema:MPD:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" minBufferTime="PT2S" type="dynamic" profiles="urn:mpeg:dash:profile:isoff-live:2011" availabilityStartTime="place_holder" minimumUpdatePeriod="PT5S" timeShiftBufferDepth="PT1800S">
|
||||||
<Period start="PT0S">
|
<Period start="PT0S">
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<Representation id="0" bandwidth="873432" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
<Representation id="0" bandwidth="876377" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
</Representation>
|
</Representation>
|
||||||
</AdaptationSet>
|
</AdaptationSet>
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<Representation id="1" bandwidth="122303" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="125028" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
<AdaptationSet id="0" contentType="video" width="640" height="360" frameRate="30000/1001" segmentAlignment="true" par="16:9">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
||||||
<Representation id="0" bandwidth="873432" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
<Representation id="0" bandwidth="876377" codecs="avc1.64001e" mimeType="video/mp4" sar="1:1" width="640" height="360" frameRate="30000/1001">
|
||||||
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
<S t="2002" d="30030" r="1"/>
|
<S t="2002" d="30030" r="1"/>
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
<AdaptationSet id="1" contentType="audio" segmentAlignment="true">
|
||||||
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="00000000-0000-0000-0000-000000000000"/>
|
||||||
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
|
||||||
<Representation id="1" bandwidth="122303" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
<Representation id="1" bandwidth="125028" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="44100">
|
||||||
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
|
||||||
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
|
||||||
<SegmentTimeline>
|
<SegmentTimeline>
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,4 @@
|
||||||
bandwidth: 882409
|
bandwidth: 885058
|
||||||
video_info {
|
video_info {
|
||||||
codec: "avc1.64001e"
|
codec: "avc1.64001e"
|
||||||
width: 640
|
width: 640
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue