MediaStreamSource を使用すると、Windows Phone で h264 ファイルを再生できますが、それについては何も見つかりません。私が見た唯一のサンプルは、それを開始するのに本当に役立ちました: http://msdn.microsoft.com/en-us/library/hh180779(v=vs.95).aspx しかし、私は運が悪かった...お願いします助けてください、できるだけ早く実装する必要があります!
しばらくの間、mediaElement.SetSource() を使用するときに呼び出される MediaStreamSource オーバーライド メソッドを実装しようとしました。私が間違っているのは何ですか?
`public class VideoMediaStreamSource : MediaStreamSource { private MediaStreamDescription _videoDesc; プライベート MediaStreamType _mediaType;
private Dictionary<MediaStreamAttributeKeys, string> _streamAttributes;
private Dictionary<MediaSourceAttributesKeys, string> _sourceAttributes;
private Dictionary<MediaSampleAttributeKeys, string> _sampleAttributes;
private Dictionary<MediaSampleAttributeKeys, string> _emptySampleDict;
private List<MediaStreamDescription> _listDesc;
private MemoryStream _frameStream;
private int _framePixelSize;
private int _frameBufferSize;
private int _currentReadyFrame;
private int _currentBufferFrame;
private int _frameTime;
private long _currentVideoTimeStamp;
private byte[][] _frames = new byte[2][];
private const int frameHeightOriginal = 384;
private const int FrameWidthOriginal = 288;
private const int BYTESPERPIXEL = 4;
#region PUBLIC CONST
public int FRAME_HEIGHT_ORIGINAL
{
get
{
return frameHeightOriginal;
}
}
public int FRAME_WIDTH_ORIGINAL
{
get
{
return FrameWidthOriginal;
}
}
#endregion
public VideoMediaStreamSource()
{
_framePixelSize = FRAME_WIDTH_ORIGINAL * frameHeightOriginal;
_frameBufferSize = _framePixelSize * BYTESPERPIXEL;
// PAL is 50 frames per second
_frameTime = (int)TimeSpan.FromSeconds((double)1 / 50).Ticks;
_frames[0] = new byte[_frameBufferSize];
_frames[1] = new byte[_frameBufferSize];
_currentBufferFrame = 0;
_currentReadyFrame = 1;
}
protected override void OpenMediaAsync()
{
_sourceAttributes = new Dictionary<MediaSourceAttributesKeys, string>();
_streamAttributes = new Dictionary<MediaStreamAttributeKeys, string>();
_listDesc = new List<MediaStreamDescription>();
_mediaType = MediaStreamType.Video;
_frameStream = new MemoryStream();
_streamAttributes[MediaStreamAttributeKeys.VideoFourCC] = "H264";
_streamAttributes[MediaStreamAttributeKeys.Height] = frameHeightOriginal.ToString();
_streamAttributes[MediaStreamAttributeKeys.Width] = FRAME_WIDTH_ORIGINAL.ToString();
_sourceAttributes[MediaSourceAttributesKeys.Duration] = TimeSpan.FromSeconds(0).Ticks.ToString(CultureInfo.InvariantCulture);
_sourceAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString();
_videoDesc = new MediaStreamDescription(_mediaType,_streamAttributes);
_listDesc.Add(_videoDesc);
ReportOpenMediaCompleted(_sourceAttributes,_listDesc);
}
protected override void CloseMedia()
{
throw new NotImplementedException();
}
protected override void SeekAsync(long seekToTime)
{
throw new NotImplementedException();
}
protected override void GetSampleAsync(MediaStreamType mediaStreamType)
{
if (mediaStreamType == MediaStreamType.Video)
{
GetVideoSample();
}
}
private void GetVideoSample()
{
_frameStream = new MemoryStream();
_frameStream.Write(_frames[_currentReadyFrame], 0, _frameBufferSize);
_emptySampleDict = new Dictionary<MediaSampleAttributeKeys, string>();
MediaStreamSample msSamp = new MediaStreamSample(
_videoDesc,
_frameStream,
0,
_frameBufferSize,
_currentVideoTimeStamp,
_emptySampleDict);
_currentVideoTimeStamp += _frameTime;
ReportGetSampleCompleted(msSamp);
}
protected override void GetDiagnosticAsync(MediaStreamSourceDiagnosticKind diagnosticKind)
{
throw new NotImplementedException();
}
protected override void SwitchMediaStreamAsync(MediaStreamDescription mediaStreamDescription)
{
throw new NotImplementedException();
}`
ここに、私が今やろうとしているコードがあります。つまり、MediaElement 内で OpenMediaAsync を呼び出すことです。「slamtv60.h264」ファイルは私のソリューションにあります。
`private void PlayMediaStreamSource() { MediaElement media = new MediaElement(); VideoMediaStreamSource videoMedia = new VideoMediaStreamSource(); media.Source = new Uri("/slamtv60.h264", UriKind.RelativeOrAbsolute); media.SetSource(videoMedia); media.AutoPlay = true;
media.Width = videoMedia.FRAME_WIDTH_ORIGINAL;
media.Height = videoMedia.FRAME_HEIGHT_ORIGINAL;
media.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
media.VerticalAlignment = System.Windows.VerticalAlignment.Center;
LayoutRoot.Children.Add(media);
}`
私を助けてください...