Как создать составной манифест для гладкой потоковой передачи Microsoft
Я новичок в Microsoft Smooth Streaming и задаю вопросы о создании составных манифестов.
Следуя указаниям здесь.
Мне удалось создать составной манифест одного элемента клипа, который играл в проигрывателе Silverlight.
Однако, когда я пытаюсь добавить больше клипов из других видео, игрок просто перестает работать и не выдаёт никаких ошибок.
И я делаю все это вручную. и когда я пытаюсь использовать Expression Encoder 4 Pro для создания такого видео, я получил обычный файл .ismc
вместо файла .csm
.
Мои вопросы:
Каков наилучший способ создания составного манифеста, который содержит клипы из разных видеороликов? Существует ли какая-либо спецификация для кодирования этих видео? или поддерживает ли составной манифест любое ограничение на видеоформат?
И последнее: есть ли простой способ его отладки (например, проверка моего .csm файла)?
ИЗМЕНИТЬ мое собственное решение:
Похоже, никто не заботится об этом, но так как я, наконец, решил это, я пишу это здесь, чтобы спасти время других.
чтобы отладить составной манифест, я создал простую программу silverlight в Visual Studio и добавлю простую функцию для сообщения о любой ошибке:
MainPage.xaml.cs:
public MainPage()
{
InitializeComponent();
this.SmoothPlayer.SmoothStreamingErrorOccurred += new EventHandler<SmoothStreamingErrorEventArgs>(SmoothPlayer_SmoothStreamingErrorOccurred);
}
public void SmoothPlayer_SmoothStreamingErrorOccurred(object sender,
SmoothStreamingErrorEventArgs e)
{
MessageBox.Show("Error: " + e.ErrorCode + "; " + e.ErrorMessage);
}
И я нашел эту веб-страницу полезной.
в основном вам нужно использовать
<c t="", d"">
вместо
<c d="">
и вам нужно правильно вычислить значения ClipBegin
и ClipEnd
.
Ниже приведен пример кода в python для преобразования .ismc
в .csm
(предположим, что ism ниже представляет собой представление объекта xml.etree.ElementTree содержимого манифеста xml):
def ism2csm(url, ism):
if ism is None: return csm
csm = xml.Element('SmoothStreamingMedia', {'MajorVersion':'2', 'MinorVersion':'1', 'Duration':ism.attrib.get('Duration')})
clip = xml.Element('Clip', {'Url':url, 'ClipBegin':'0','ClipEnd':'0'})
csm.append(clip)
for stream_index in ism.iter('StreamIndex'):
clip.append(stream_index)
for stream_index in clip.iter('StreamIndex'):
t = 0
last_c = None
for c in stream_index.iter('c'):
c.attrib['t'] = str(t)
t += int(c.attrib.get('d'))
if last_c is not None: del last_c.attrib['d']
last_c = c
if clip.attrib.get('ClipEnd') == '0':
clip.attrib['ClipEnd'] = str(t)
return csm