Microsoft Smooth Streaming は初めてで、複合マニフェストの作成について質問があります。
ここからのガイダンスに従ってください。
Silverlight プレーヤーで再生される単一のクリップ要素の複合マニフェストを作成できました。
しかし、他のビデオからさらにクリップを追加しようとすると、プレーヤーは動作を停止し、エラー情報は表示されませんでした。
そして、私はこれをすべて手作業で行っています。Expression Encoder 4 Pro を使用してそのようなビデオを作成しようとすると、.ismc
ファイルではなく通常のファイルが作成されました.csm
。
私の質問は次のとおりです。
さまざまなビデオのクリップを含む複合マニフェストを作成する最良の方法は何ですか? これらのビデオをエンコードする際に従うべき仕様はありますか? または、複合マニフェストのサポートにより、ビデオ形式に何らかの制限が課されますか?
最後に、デバッグする簡単な方法はありますか (.csm ファイルを検証するなど)?
自分のソリューションを編集します:
誰も気にしていないようですが、ようやく解決したので、他の人の時間を節約するためにここに書き留めておきます。
複合マニフェストをデバッグするために、Visual Studio で単純な Silverlight アプリを作成し、エラーを報告する単純な関数を追加しました。
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
ます。
.ismc
以下は、aを aに変換する Python のサンプル コードです.csm
(以下の ism は、マニフェスト xml コンテンツの xml.etree.ElementTree オブジェクト表現であると仮定します)。
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