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 # 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,8 +64,8 @@ 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):
self.packager.Package(self._GetStreams(['0']), self._GetFlags()) 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') 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'],
self._GetFlags()) test_files=['subtitle-english.vtt']),
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,89 +100,129 @@ 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._GetFlags(encryption=True)) self._GetStreams(['audio', 'video']),
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'],
self._GetFlags(encryption=True)) 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.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._GetFlags(encryption=True, self._GetStreams(['audio', 'video']),
output_media_info=True)) self._GetFlags(encryption=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')
self._DiffGold(self.output[1], 'bear-640x360-v-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[0], 'bear-640x360-a-cenc-golden.mp4')
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._GetFlags(live=True)) self._GetStreams(
['audio', 'video'],
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(
dash_if_iop=True)) ['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[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(
live=True)) ['audio', 'video'],
live=True),
self._GetFlags(encryption=True,
key_rotation=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')
self._DiffLiveGold(self.output[1], self._DiffLiveGold(self.output[1],
@ -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,92 +272,101 @@ 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 len(test_files) == 1:
if live: output_prefix = '%s_%s' % (self.output_prefix, stream_descriptor)
# 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))
else: else:
output = '%s_%s.%s' % (self.output_prefix, output_prefix = '%s_%d_%s' % (self.output_prefix, test_file_index,
stream_descriptor, stream_descriptor)
self._GetExtension(stream_descriptor)) if live:
stream = 'input=%s,stream=%s,output=%s' stream = ('input=%s,stream=%s,init_segment=%s-init.mp4,'
streams.append(stream % (input, stream_descriptor, output)) 'segment_template=%s-$Number$.m4s')
self.output.append(output) 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 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,
use_fake_clock = True): widevine_encryption=False,
key_rotation=False,
live=False,
dash_if_iop=False,
output_media_info=False,
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',
if not random_iv: '--clear_lead=1']
flags.append('--iv=33343536373839303132333435363738') if not random_iv:
if key_rotation: flags.append('--crypto_period_duration=1') flags.append('--iv=3334353637383930')
if key_rotation:
flags.append('--crypto_period_duration=1')
if live: if live:
flags.append('--profile=live') flags.append('--profile=live')
if dash_if_iop: if dash_if_iop:
flags.append('--generate_dash_if_iop_compliant_mpd') flags.append('--generate_dash_if_iop_compliant_mpd')
if output_media_info: if output_media_info:
flags.append('--output_media_info') flags.append('--output_media_info')
else: else:
flags += ['--mpd_output', self.mpd_output] flags += ['--mpd_output', self.mpd_output]
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)
@ -318,9 +376,9 @@ class PackagerAppTest(unittest.TestCase):
media_info_output = test_output + '.media_info' media_info_output = test_output + '.media_info'
# Replaces filename, which is changing for every test run. # Replaces filename, which is changing for every test run.
with open(media_info_output, 'r') as f: with open(media_info_output, 'r') as f:
content = f.read() content = f.read()
with open(media_info_output, 'w') as f: 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') self._DiffGold(media_info_output, golden_file_name + '.media_info')
def _DiffLiveGold(self, test_output_prefix, golden_file_name_prefix): 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', self._DiffGold(test_output_prefix + '-init.mp4',
golden_file_name_prefix + '-init.mp4') golden_file_name_prefix + '-init.mp4')
for i in range(1, 4): for i in range(1, 4):
self._DiffGold(test_output_prefix + '-%d.m4s' % i, self._DiffGold(test_output_prefix + '-%d.m4s' % i,
golden_file_name_prefix + '-%d.m4s' % i) golden_file_name_prefix + '-%d.m4s' % i)
# Live mpd contains a current availabilityStartTime, which needs to be # Live mpd contains a current availabilityStartTime, which needs to be
# replaced for comparison. # replaced for comparison.
def _DiffLiveMpdGold(self, test_output, golden_file_name): def _DiffLiveMpdGold(self, test_output, golden_file_name):
with open(test_output, 'r') as f: with open(test_output, 'r') as f:
content = f.read() content = f.read()
# 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):

View File

@ -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:

View File

@ -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

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"> <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">

View File

@ -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">

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"> <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">

View File

@ -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>

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"> <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"/>

View File

@ -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>

View File

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