如何在调用MediaStreamSample.CreateFromStreamAsync(stream,timespan)时设置时间跨度 [英] How to set the timespan when invoke MediaStreamSample.CreateFromStreamAsync(stream, timespan)

查看:83
本文介绍了如何在调用MediaStreamSample.CreateFromStreamAsync(stream,timespan)时设置时间跨度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有mediaserver流出原始h264 throgh websocket。


在MediaStreamSource_SampleRequested事件中需要在创建样本时设置时间跨度。


但我每409600字节收到一次h264来创建样本,这是多少时间? 


任何好的建议?



  MediaStreamSource mediaStreamSource;

       私人StreamWebSocket _ws;

        private string _uri;

        TimeSpan pts = TimeSpan.FromMilliseconds(0);

        TimeSpan dur = TimeSpan.FromMilliseconds(0);

        public MainPage()

        {

            this.InitializeComponent();

            var videoProperties = VideoEncodingProperties.CreateH264();

            videoProperties.FrameRate.Numerator = 25;

            videoProperties.FrameRate.Denominator = 1;

            var videoStreamDec = new VideoStreamDescriptor(videoProperties);

            mediaStreamSource = new MediaStreamSource(videoStreamDec);

            mediaStreamSource.CanSeek = false;

            mediaStreamSource.IsLive = true;



            TimeSpan spanBuffer = new TimeSpan(0,0,0,1,0);

            mediaStreamSource.BufferTime = spanBuffer;

            mediaStreamSource.Starting + = MediaStreamSource_Starting;

            mediaStreamSource.SampleRequested + = MediaStreamSource_SampleRequestedAsync;

            media.CurrentStateChanged + = Media_CurrentStateChanged;



        }


        private void MediaStreamSource_Starting(MediaStreamSource sender,MediaStreamSourceStartingEventArgs args)

        {

            // args.Request.SetActualStartPosition(new TimeSpan());

        }


        private void Media_CurrentStateChanged(object sender,RoutedEventArgs e)

        {

            Debug.WriteLine(media.CurrentState);

            media.Play();

        }




$
        private async void MediaStreamSource_SampleRequestedAsync(MediaStreamSource sender,MediaStreamSourceSampleRequestedEventArgs args)

        {

            //  MemoryBuffer m = new MemoryBuffer(10240);

            //  var b = Windows.Storage.Streams.Buffer.CreateCopyFromMemoryBuffer(m);

            //等待_ws.InputStream.ReadAsync(b,10240,InputStreamOptions.None);



            // var a = b.ToArray();

            //  Debug.WriteLine(a.Length);

            //  long pts = 0;

            //  long dur = 0;

            var deferal = args.Request.GetDeferral();

            var sample = await MediaStreamSample.CreateFromStreamAsync(_ws.InputStream,40960,pts);



            args.Request.Sample = sample;

            pts + = TimeSpan.FromMilliseconds(58);

            //args.Request.Sample.Duration = TimeSpan.FromMilliseconds(58);

            deferal.Complete();



$
        }


        private async void PlayButton_ClickAsync(object sender,RoutedEventArgs e)

        {

$
            _uri =" ws://192.168.1.37:8801 / h5sws / Tiandi" ;;

            _ws = new StreamWebSocket();

            await _ws.ConnectAsync(new Uri(_uri,UriKind.Absolute));

            media.SetMediaStreamSource(mediaStreamSource);

        }

解决方案

Hi Js_liu


我对你的问题感到困惑。


>>

如何在调用MediaStreamSample.CreateFromStreamAsync(stream,timespan)时设置时间跨度


从你的代码中,我注意到你已经设置了TimeSpan。


首先,您定义了一个名为< pts>的TimeSpan并将其设置为零。当您调用
CreateFromStreamAsync()方法时,您将此变量用作TimeSpan参数。



   TimeSpan pts = TimeSpan.FromMilliseconds(0);   

var sample = await MediaStreamSample.CreateFromStreamAsync(_ws.InputStream,40960, pts );
args.Request .Sample = sample;
pts + = TimeSpan.FromMilliseconds(58);






然后每当
调用CreateFromStreamAsync()。


似乎您收到40960
字节  每58毫秒。



有一个

MediaStreamSource示例
,以获取在UWP应用中使用媒体流源的示例。


您可以参考此场景1获取更多信息。虽然它是一个Windows 8.1
样本,但它可以在Windows 10中成功运行。删除错误代码 
场景2,你可以成功运行它。



最好的问候,


罗伊


we have mediaserver stream out raw h264 throgh websocket.

in the MediaStreamSource_SampleRequested event need set the timespan when create a sample.

but I receive the h264 every 409600 bytes to create sample, how much time it's? 

any good suggestion?

 MediaStreamSource mediaStreamSource;
        private StreamWebSocket _ws;
        private string _uri;
        TimeSpan pts = TimeSpan.FromMilliseconds(0);
        TimeSpan dur = TimeSpan.FromMilliseconds(0);
        public MainPage()
        {
            this.InitializeComponent();
            var videoProperties = VideoEncodingProperties.CreateH264();
            videoProperties.FrameRate.Numerator = 25;
            videoProperties.FrameRate.Denominator = 1;
            var videoStreamDec = new VideoStreamDescriptor(videoProperties);
            mediaStreamSource = new MediaStreamSource(videoStreamDec);
            mediaStreamSource.CanSeek = false;
            mediaStreamSource.IsLive = true;

            TimeSpan spanBuffer = new TimeSpan(0, 0, 0, 1, 0);
            mediaStreamSource.BufferTime = spanBuffer;
            mediaStreamSource.Starting += MediaStreamSource_Starting;
            mediaStreamSource.SampleRequested += MediaStreamSource_SampleRequestedAsync;
            media.CurrentStateChanged += Media_CurrentStateChanged;

        }

        private void MediaStreamSource_Starting(MediaStreamSource sender, MediaStreamSourceStartingEventArgs args)
        {
           // args.Request.SetActualStartPosition(new TimeSpan());
        }

        private void Media_CurrentStateChanged(object sender, RoutedEventArgs e)
        {
            Debug.WriteLine(media.CurrentState);
            media.Play();
        }



        private async void MediaStreamSource_SampleRequestedAsync(MediaStreamSource sender, MediaStreamSourceSampleRequestedEventArgs args)
        {
            //  MemoryBuffer m = new MemoryBuffer(10240);
            //  var b= Windows.Storage.Streams.Buffer.CreateCopyFromMemoryBuffer(m);
            // await _ws.InputStream.ReadAsync(b,10240,InputStreamOptions.None);

            //var a= b.ToArray();
            //  Debug.WriteLine(a.Length);
            //  long pts = 0;
            //  long dur = 0;
            var deferal = args.Request.GetDeferral();
            var sample = await MediaStreamSample.CreateFromStreamAsync(_ws.InputStream, 40960, pts);

            args.Request.Sample = sample;
            pts += TimeSpan.FromMilliseconds(58);
            //args.Request.Sample.Duration = TimeSpan.FromMilliseconds(58);
            deferal.Complete();


        }

        private async void PlayButton_ClickAsync(object sender, RoutedEventArgs e)
        {

            _uri = "ws://192.168.1.37:8801/h5sws/Tiandi";
            _ws = new StreamWebSocket();
            await _ws.ConnectAsync(new Uri(_uri, UriKind.Absolute));
            media.SetMediaStreamSource(mediaStreamSource);
        }

解决方案

Hi Js_liu

I’m little confused about your question.

>> How to set the timespan when invoke MediaStreamSample.CreateFromStreamAsync(stream, timespan)

From your code, I noticed that you have set the TimeSpan already.

First, you defined a TimeSpan called <pts> and set it to zero. When you invoke the CreateFromStreamAsync() method, you used this variable as the TimeSpan parameter.

TimeSpan pts = TimeSpan.FromMilliseconds(0);

var sample = await MediaStreamSample.CreateFromStreamAsync(_ws.InputStream, 40960,pts);
 args.Request.Sample = sample;
pts += TimeSpan.FromMilliseconds(58);


Then you add 58 milliseconds to the <pts> every time when the CreateFromStreamAsync() is called.

It seems that you receive 40960 bytes every 58 milliseconds.

There is a MediaStreamSource Sample for an example of using Media Stream Source in a UWP app.

You could refer this Scenario 1 for more information. Although it is a windows 8.1 sample, but it could run in windows 10 successfully. Delete the wrong codes in Scenario 2 and you could run it successfully.

Best regards,

Roy


这篇关于如何在调用MediaStreamSample.CreateFromStreamAsync(stream,timespan)时设置时间跨度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆