0

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);
    }`

私を助けてください...

4

0 に答える 0