0

Afaik 使用 MediaStreamSource 我可以在 windows phone 中播放 h264 文件,但我没有找到任何关于它的信息。我看到并真正帮助我开始的唯一示例是:http: //msdn.microsoft.com/en-us/library/hh180779 (v= vs.95).aspx 但我不走运......请帮帮我,我需要尽快实施!

有一段时间,我尝试实现使用 mediaElement.SetSource() 时要调用的 MediaStreamSource 覆盖方法。我做错了什么?

`公共类VideoMediaStreamSource:MediaStreamSource {私有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.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