如何在调用MediaStreamSample.CreateFromStreamAsync(stream,timespan)时设置时间跨度 [英] How to set the timespan when invoke 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屋!