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:
KongQun Yang 2015-10-01 16:29:52 -07:00
parent f88e04a1bb
commit 6ca2ea9a24
23 changed files with 182 additions and 124 deletions

View File

@ -5,10 +5,8 @@
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
"""Tests utilizing the sample packager binary."""
import filecmp
import os
import re
@ -26,6 +24,10 @@ class PackagerAppTest(unittest.TestCase):
def setUp(self):
self.packager = packager_app.PackagerApp()
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.mpd_output = self.output_prefix + '.mpd'
self.output = None
@ -37,9 +39,8 @@ class PackagerAppTest(unittest.TestCase):
self.assertEqual(0, self.packager.BuildSrc())
def testDumpStreamInfo(self):
input = os.path.join(test_env.SRC_DIR, 'packager', 'media', 'test', 'data',
'bear-640x360.mp4')
stream_info = self.packager.DumpStreamInfo(input)
test_file = os.path.join(self.test_data_dir, 'bear-640x360.mp4')
stream_info = self.packager.DumpStreamInfo(test_file)
expected_stream_info = ('Found 2 stream(s).\n'
'Stream [0] type: Video\n'
' codec_string: avc1.64001e\n'
@ -63,8 +64,8 @@ class PackagerAppTest(unittest.TestCase):
' sampling_frequency: 44100\n'
' language: und\n')
self.assertIn(expected_stream_info, stream_info,
"\nExpecting: \n %s\n\nBut seeing: \n%s" % (
expected_stream_info, stream_info))
'\nExpecting: \n %s\n\nBut seeing: \n%s' % (
expected_stream_info, stream_info))
def testPackageFirstStream(self):
self.packager.Package(self._GetStreams(['0']), self._GetFlags())
@ -72,15 +73,17 @@ class PackagerAppTest(unittest.TestCase):
self._DiffGold(self.mpd_output, 'bear-640x360-v-golden.mpd')
def testPackageText(self):
self.packager.Package(self._GetStreams(['text'],
test_file='subtitle-english.vtt'),
self._GetFlags())
self.packager.Package(
self._GetStreams(['text'],
test_files=['subtitle-english.vtt']),
self._GetFlags())
self._DiffGold(self.output[0], 'subtitle-english-golden.vtt')
self._DiffGold(self.mpd_output, 'subtitle-english-vtt-golden.mpd')
# Probably one of the most common scenarios is to package audio and video.
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[1], 'bear-640x360-v-golden.mp4')
self._DiffGold(self.mpd_output, 'bear-640x360-av-golden.mpd')
@ -88,7 +91,8 @@ class PackagerAppTest(unittest.TestCase):
# Package all video, audio, and text.
def testPackageVideoAudioText(self):
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._DiffGold(self.output[0], 'bear-640x360-a-golden.mp4')
self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4')
@ -96,89 +100,129 @@ class PackagerAppTest(unittest.TestCase):
self._DiffGold(self.mpd_output, 'bear-640x360-avt-golden.mpd')
def testPackageWithEncryption(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True))
self.packager.Package(
self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True))
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.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
def testPackageHevcWithEncryption(self):
self.packager.Package(self._GetStreams(['video'],
test_file='bear-640x360-hevc.mp4'),
self._GetFlags(encryption=True))
self.packager.Package(
self._GetStreams(['video'],
test_files=['bear-640x360-hevc.mp4']),
self._GetFlags(encryption=True))
self._DiffGold(self.output[0], 'bear-640x360-hevc-v-cenc-golden.mp4')
self._DiffGold(self.mpd_output, 'bear-640x360-hevc-v-cenc-golden.mpd')
def testPackageWithEncryptionAndRandomIv(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True, random_iv=True))
self.packager.Package(
self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True,
random_iv=True))
self._AssertStreamInfo(self.output[0], '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
# golden files.
self.assertFalse(self._CompareWithGold(
self.output[0], 'bear-640x360-a-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(
self.output[1], 'bear-640x360-v-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(self.output[0],
'bear-640x360-a-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(self.output[1],
'bear-640x360-v-cenc-golden.mp4'))
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
def testPackageWithEncryptionAndRealClock(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True, use_fake_clock=False))
self.packager.Package(
self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True,
use_fake_clock=False))
self._AssertStreamInfo(self.output[0], '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
# golden files.
self.assertFalse(self._CompareWithGold(
self.output[0], 'bear-640x360-a-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(
self.output[1], 'bear-640x360-v-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(self.output[0],
'bear-640x360-a-cenc-golden.mp4'))
self.assertFalse(self._CompareWithGold(self.output[1],
'bear-640x360-v-cenc-golden.mp4'))
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-golden.mpd')
def testPackageWithEncryptionAndDashIfIop(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True, dash_if_iop=True))
self.packager.Package(
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[1], 'bear-640x360-v-cenc-golden.mp4')
self._DiffGold(self.mpd_output, 'bear-640x360-av-cenc-iop-golden.mpd')
def testPackageWithEncryptionAndOutputMediaInfo(self):
self.packager.Package(self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True,
output_media_info=True))
self.packager.Package(
self._GetStreams(['audio', 'video']),
self._GetFlags(encryption=True,
output_media_info=True))
self._DiffGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
self._DiffGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
self._DiffMediaInfoGold(self.output[0], 'bear-640x360-a-cenc-golden.mp4')
self._DiffMediaInfoGold(self.output[1], 'bear-640x360-v-cenc-golden.mp4')
def testPackageWithLiveProfile(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(live=True))
self.packager.Package(
self._GetStreams(
['audio', 'video'],
live=True),
self._GetFlags(live=True))
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-golden')
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-golden')
self._DiffLiveMpdGold(self.mpd_output, 'bear-640x360-av-live-golden.mpd')
def testPackageWithLiveProfileAndEncryption(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, live=True))
self.packager.Package(
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[1], 'bear-640x360-v-live-cenc-golden')
self._DiffLiveMpdGold(self.mpd_output,
'bear-640x360-av-live-cenc-golden.mpd')
def testPackageWithLiveProfileAndEncryptionAndDashIfIop(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, live=True,
dash_if_iop=True))
self.packager.Package(
self._GetStreams(
['audio', 'video'],
live=True),
self._GetFlags(encryption=True,
live=True,
dash_if_iop=True))
self._DiffLiveGold(self.output[0], 'bear-640x360-a-live-cenc-golden')
self._DiffLiveGold(self.output[1], 'bear-640x360-v-live-cenc-golden')
self._DiffLiveMpdGold(self.mpd_output,
'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):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, key_rotation=True,
live=True))
self.packager.Package(
self._GetStreams(
['audio', 'video'],
live=True),
self._GetFlags(encryption=True,
key_rotation=True,
live=True))
self._DiffLiveGold(self.output[0],
'bear-640x360-a-live-cenc-rotation-golden')
self._DiffLiveGold(self.output[1],
@ -187,9 +231,14 @@ class PackagerAppTest(unittest.TestCase):
'bear-640x360-av-live-cenc-rotation-golden.mpd')
def testPackageWithLiveProfileAndKeyRotationAndDashIfIop(self):
self.packager.Package(self._GetStreams(['audio', 'video'], live=True),
self._GetFlags(encryption=True, key_rotation=True,
live=True, dash_if_iop=True))
self.packager.Package(
self._GetStreams(
['audio', 'video'],
live=True),
self._GetFlags(encryption=True,
key_rotation=True,
live=True,
dash_if_iop=True))
self._DiffLiveGold(self.output[0],
'bear-640x360-a-live-cenc-rotation-golden')
self._DiffLiveGold(self.output[1],
@ -223,92 +272,101 @@ class PackagerAppTest(unittest.TestCase):
self._AssertStreamInfo(self.output[0], 'is_encrypted: true')
self._AssertStreamInfo(self.output[1], 'is_encrypted: true')
def _GetStreams(self, stream_descriptors, live = False,
test_file = 'bear-640x360.mp4'):
def _GetStreams(self, stream_descriptors, live=False, test_files=None):
if test_files is None:
test_files = ['bear-640x360.mp4']
streams = []
if not self.output:
self.output = []
test_data_dir = os.path.join(
test_env.SRC_DIR, 'packager', 'media', 'test', 'data')
input = os.path.join(test_data_dir, test_file)
for stream_descriptor in stream_descriptors:
if live:
# This is still output prefix actually.
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))
for test_file_index, test_file_name in enumerate(test_files):
test_file = os.path.join(self.test_data_dir, test_file_name)
for stream_descriptor in stream_descriptors:
if len(test_files) == 1:
output_prefix = '%s_%s' % (self.output_prefix, stream_descriptor)
else:
output = '%s_%s.%s' % (self.output_prefix,
stream_descriptor,
self._GetExtension(stream_descriptor))
stream = 'input=%s,stream=%s,output=%s'
streams.append(stream % (input, stream_descriptor, output))
self.output.append(output)
output_prefix = '%s_%d_%s' % (self.output_prefix, test_file_index,
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))
stream = 'input=%s,stream=%s,output=%s'
streams.append(stream % (test_file, stream_descriptor, output))
self.output.append(output)
return streams
def _GetExtension(self, stream_descriptor):
# TODO(rkuroiwa): Support ttml.
if stream_descriptor == "text":
return "vtt"
return "mp4"
if stream_descriptor == 'text':
return 'vtt'
return 'mp4'
def _GetFlags(self, encryption = False, random_iv = False,
widevine_encryption = False, key_rotation = False,
live = False, dash_if_iop=False, output_media_info = False,
use_fake_clock = True):
def _GetFlags(self,
encryption=False,
random_iv=False,
widevine_encryption=False,
key_rotation=False,
live=False,
dash_if_iop=False,
output_media_info=False,
use_fake_clock=True):
flags = []
if widevine_encryption:
widevine_server_url = ('https://license.uat.widevine.com/cenc' +
'/getcontentkey/widevine_test')
flags += ['--enable_widevine_encryption',
'--key_server_url=' + widevine_server_url,
'--content_id=3031323334353637',
'--signer=widevine_test']
widevine_server_url = ('https://license.uat.widevine.com/cenc'
'/getcontentkey/widevine_test')
flags += ['--enable_widevine_encryption',
'--key_server_url=' + widevine_server_url,
'--content_id=3031323334353637', '--signer=widevine_test']
elif encryption:
flags += ['--enable_fixed_key_encryption',
'--key_id=31323334353637383930313233343536',
'--key=32333435363738393021323334353637',
'--pssh=31323334353637383930313233343536']
if not random_iv:
flags.append('--iv=33343536373839303132333435363738')
if key_rotation: flags.append('--crypto_period_duration=1')
flags += ['--enable_fixed_key_encryption',
'--key_id=31323334353637383930313233343536',
'--key=32333435363738393021323334353637',
'--pssh=31323334353637383930313233343536',
'--clear_lead=1']
if not random_iv:
flags.append('--iv=3334353637383930')
if key_rotation:
flags.append('--crypto_period_duration=1')
if live:
flags.append('--profile=live')
flags.append('--profile=live')
if dash_if_iop:
flags.append('--generate_dash_if_iop_compliant_mpd')
flags.append('--generate_dash_if_iop_compliant_mpd')
if output_media_info:
flags.append('--output_media_info')
flags.append('--output_media_info')
else:
flags += ['--mpd_output', self.mpd_output]
flags += ['--mpd_output', self.mpd_output]
flags.append('--segment_duration=1')
# Use fake clock, so output can be compared.
if use_fake_clock:
flags.append("--use_fake_clock_for_muxer")
flags.append('--use_fake_clock_for_muxer')
return flags
def _CompareWithGold(self, test_output, golden_file_name):
golden_file = os.path.join(test_env.SRC_DIR, 'packager', 'app', 'test',
'testdata', golden_file_name)
golden_file = os.path.join(self.golden_file_dir, golden_file_name)
return filecmp.cmp(test_output, golden_file)
def _DiffGold(self, test_output, golden_file_name):
golden_file = os.path.join(test_env.SRC_DIR, 'packager', 'app', 'test',
'testdata', golden_file_name)
golden_file = os.path.join(self.golden_file_dir, golden_file_name)
if test_env.options.test_update_golden_files:
if not filecmp.cmp(test_output, golden_file):
print "Updating golden file: ", golden_file_name
shutil.copyfile(test_output, golden_file)
if not filecmp.cmp(test_output, golden_file):
print 'Updating golden file: ', golden_file_name
shutil.copyfile(test_output, golden_file)
else:
match = filecmp.cmp(test_output, golden_file)
if not match:
p = subprocess.Popen(['git', '--no-pager', 'diff', '--color=auto',
'--no-ext-diff', '--no-index',
golden_file, test_output],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p = subprocess.Popen(
['git', '--no-pager', 'diff', '--color=auto', '--no-ext-diff',
'--no-index', golden_file, test_output],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
output, error = p.communicate()
self.fail(output + error)
@ -318,9 +376,9 @@ class PackagerAppTest(unittest.TestCase):
media_info_output = test_output + '.media_info'
# Replaces filename, which is changing for every test run.
with open(media_info_output, 'r') as f:
content = f.read()
content = f.read()
with open(media_info_output, 'w') as f:
f.write(content.replace(test_output, 'place_holder'))
f.write(content.replace(test_output, 'place_holder'))
self._DiffGold(media_info_output, golden_file_name + '.media_info')
def _DiffLiveGold(self, test_output_prefix, golden_file_name_prefix):
@ -328,21 +386,21 @@ class PackagerAppTest(unittest.TestCase):
self._DiffGold(test_output_prefix + '-init.mp4',
golden_file_name_prefix + '-init.mp4')
for i in range(1, 4):
self._DiffGold(test_output_prefix + '-%d.m4s' % i,
golden_file_name_prefix + '-%d.m4s' % i)
self._DiffGold(test_output_prefix + '-%d.m4s' % i,
golden_file_name_prefix + '-%d.m4s' % i)
# Live mpd contains a current availabilityStartTime, which needs to be
# replaced for comparison.
def _DiffLiveMpdGold(self, test_output, golden_file_name):
with open(test_output, 'r') as f:
content = f.read()
content = f.read()
# Extract availabilityStartTime
m = re.search('(?<=availabilityStartTime=")[^"]+', content)
self.assertIsNotNone(m)
availabilityStartTime = m.group(0)
print 'availabilityStartTime: ', availabilityStartTime
availability_start_time = m.group(0)
print 'availabilityStartTime: ', availability_start_time
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)
def _AssertStreamInfo(self, stream, info):

View File

@ -39,7 +39,7 @@ parser.add_argument('--test_update_golden_files', default=0, type=int)
options, args = parser.parse_known_args()
sys.argv[1:] = args
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_rsa_flags = False
if options.rsa_signing_key_path:

View File

@ -1,4 +1,4 @@
bandwidth: 126684
bandwidth: 128635
audio_info {
codec: "mp4a.40.2"
sampling_frequency: 44100

View File

@ -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">
<Period>
<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 schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
@ -14,7 +14,7 @@
</Representation>
</AdaptationSet>
<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"/>
<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">

View File

@ -6,7 +6,7 @@
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</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>
<SegmentBase indexRange="941-1008" timescale="30000">
<Initialization range="0-940"/>
@ -18,7 +18,7 @@
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</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"/>
<BaseURL>output_audio.mp4</BaseURL>
<SegmentBase indexRange="817-884" timescale="44100">

View File

@ -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">
<Period start="PT0S">
<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 schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
@ -16,7 +16,7 @@
</Representation>
</AdaptationSet>
<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"/>
<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">

View File

@ -6,7 +6,7 @@
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</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">
<SegmentTimeline>
<S t="2002" d="30030" r="1"/>
@ -20,7 +20,7 @@
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAMHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABAxMjM0NTY3ODkwMTIzNDU2</cenc:pssh>
</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"/>
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
<SegmentTimeline>

View File

@ -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">
<Period start="PT0S">
<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 schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"/>
<SegmentTemplate timescale="30000" initialization="output_video-init.mp4" media="output_video-$Number$.m4s" startNumber="1">
@ -14,7 +14,7 @@
</Representation>
</AdaptationSet>
<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"/>
<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"/>

View File

@ -4,7 +4,7 @@
<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 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">
<SegmentTimeline>
<S t="2002" d="30030" r="1"/>
@ -16,7 +16,7 @@
<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 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"/>
<SegmentTemplate timescale="44100" initialization="output_audio-init.mp4" media="output_audio-$Number$.m4s" startNumber="1">
<SegmentTimeline>

View File

@ -1,4 +1,4 @@
bandwidth: 882409
bandwidth: 885058
video_info {
codec: "avc1.64001e"
width: 640