2012-12-03 13 views
1

我想让我的MediaStreamSource在Windows Phone 7.1上运行。 对于像256 * 256或512 * 512这样的较小分辨率,它可以工作,但在某种分辨率下,它在我称为ReportOpenMediaCompleted后立即关闭。 我没有得到任何例外或诸如此类。WP7 RGBA MediaStreamSource立即关闭 - 高分辨率

这里是我的代码:

public class BitmapStreamSource : MediaStreamSource 
{ 
    MediaStreamDescription bitmapMediaStream; 
    const int width = 1024; 
    const int height = 1024; 


    protected override void OpenMediaAsync() 
    { 
     Dictionary<MediaSourceAttributesKeys, string> mediaStreamAttributes; 

     List<MediaStreamDescription> availableMediaStreams; 
     Dictionary<MediaStreamAttributeKeys, string> bitmapStreamAttributes; 


     mediaStreamAttributes = new Dictionary<MediaSourceAttributesKeys, string>(2); 
     mediaStreamAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString(); 
     mediaStreamAttributes[MediaSourceAttributesKeys.Duration] = "-1"; 


     bitmapStreamAttributes = new Dictionary<MediaStreamAttributeKeys,string>(3); 
     bitmapStreamAttributes[MediaStreamAttributeKeys.VideoFourCC]= "RGBA"; 
     bitmapStreamAttributes[MediaStreamAttributeKeys.Width]= width.ToString(); 
     bitmapStreamAttributes[MediaStreamAttributeKeys.Height] = height.ToString(); 

     bitmapMediaStream = new MediaStreamDescription(MediaStreamType.Video, bitmapStreamAttributes); 
     availableMediaStreams = new List<MediaStreamDescription>(1); 
     availableMediaStreams.Add(bitmapMediaStream); 


     ReportOpenMediaCompleted(mediaStreamAttributes, availableMediaStreams); 
    } 

    protected override void SeekAsync(long seekToTime) 
    { 
     ReportSeekCompleted(seekToTime); 
    } 

    int sampleCount = 0; 
    protected override void GetSampleAsync(MediaStreamType mediaStreamType) 
    { 
      int pixel = width * height; 
      var buffer = new byte[pixel * 4]; 

      for (int i = 0; i < pixel; i++) 
      { 
       byte value = (byte)((i + sampleCount) % 256); 

       var k = i * 4; 
       //buffer[k] = 255; // B 
       buffer[k + 1] = value; // G 
       buffer[k + 2] = 255; // R 
       //buffer[k + 3] = value; // A 
      } 


      var stream = new MemoryStream(buffer); 

      var keys = new Dictionary<MediaSampleAttributeKeys, string>(); 
      var sample = new MediaStreamSample(bitmapMediaStream, stream, 0, buffer.Length, 0, keys); 

      sampleCount++; 
      ReportGetSampleCompleted(sample); 
    } 

    protected override void CloseMedia() 
    { 
     Debug.WriteLine("CloseMedia()"); 
    } 

    protected override void GetDiagnosticAsync(MediaStreamSourceDiagnosticKind diagnosticKind) 
    { 
     throw new NotImplementedException(); 
    } 

    protected override void SwitchMediaStreamAsync(MediaStreamDescription mediaStreamDescription) 
    { 
     throw new NotImplementedException(); 
    } 
} 

回答

1

你超越你的Windows Phone 7.x的设备(或仿真器)的媒体功能。

一般而言,支持的最大分辨率和视频编解码器取决于手机内部的SoC芯片,并且Windows Phone 7.x和8.0均有记录here on MSDN

特别是Windows Phone 7.x手机内的芯片通常限制分辨率为1280x720或800x480分辨率。 Windows Phone 8手机可能支持更高的分辨率。

如果您正在使用模拟器,这会变得更加复杂 - 它通常会模拟典型的设备功能,但您需要测试媒体在真实设备上的行为方式。

+0

这几乎回答了我的问题。我必须找到另一种方法将我的高分辨率内容呈现在屏幕上。 –