Windows Phone 实时播放H264裸码流

      因为项目的需要,近日调研了一下在 Windows Phone 手机上播放H264裸码流的方法,期间参考了大量的网络资源,最终得以解决这个问题,对如此具有钻研和奉献精神的他们表示诚挚的感谢!

       在查阅资料的过程中,首先遇到的比较头疼的问题就是太多的资料都是讲述如何在SilverLight页面上解码HVU或H264数据呈现音视频,虽然将这些代码移植到 WP7 上很简单,但是要呈现出视频就不是那么简单了,偶再一次的在这个问题上磨练了心智。书归正传,在移植过程中,总共遇到两个大的问题,第一个是在模拟器上怎么也呈现不出视频,第二个是在模拟器上呈现出视频后,在真机上怎么也显不出视频。我擦,真的很凄惨啊,搞的偶吃不香睡不香,期间备受折磨啊,呜呜!

       首先说第一个问题,在模拟器上显示视频。根据前辈们的指点,两个条件是必须的:MediaElement控件和用来设置MediaElement数据源的继承自MediaStreamSource的类(暂时命名为H264MediaStreamSource吧)。在调研这个问题时,我仔细阅读了“在 Silverlight 应用程序中实现对 FLV 视频格式的支持”这片文章,其中“如何解码 FLV 文件中的 H.264 视频流”这段研读的很仔细,不过之后移植到Windows Phone 手机程序上,模拟器不显视频的原因也出自这里,因为作者的程序是Silverlight 应用程序,正如文中所言,一些属性是不需要设置的,但是在Windows Phone程序中,这些属性就必须设置了,譬如MediaSampleAttributeKeys和MediaStreamAttributeKeys枚举中的宽高值。经过验证,即便是在XAML里面设置了MediaElement的宽高值,如果在H264MediaStreamSource里面不设置MediaSampleAttributeKeys和MediaStreamAttributeKeys枚举中的宽高值,再怎么样在模拟器中也是显示不了视频图像的。重载方法OpenMediaAsync的代码如下:

protected override void OpenMediaAsync()        

{            

    emptyDict[MediaSampleAttributeKeys.FrameWidth] = width.ToString();   

    emptyDict[MediaSampleAttributeKeys.FrameHeight] = height.ToString();

    Dictionary<MediaStreamAttributeKeys, string> videoStreamAttributes = new Dictionary<MediaStreamAttributeKeys, string>();

    videoStreamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = "";        

    videoStreamAttributes[MediaStreamAttributeKeys.VideoFourCC] = "H264";        

    videoStreamAttributes[MediaStreamAttributeKeys.Width] = width.ToString();         

    videoStreamAttributes[MediaStreamAttributeKeys.Height] = height.ToString();         

    this.videoStreamDescription = new MediaStreamDescription(MediaStreamType.Video, videoStreamAttributes);

          

    Dictionary<MediaSourceAttributesKeys, string> mediaSourceAttributes = new Dictionary<MediaSourceAttributesKeys, string>();

    mediaSourceAttributes[MediaSourceAttributesKeys.Duration] = "0";          

   if (stream.CanSeek)          

   {              

        mediaSourceAttributes[MediaSourceAttributesKeys.CanSeek] = "1";        

    }         

    else        

   {        

         mediaSourceAttributes[MediaSourceAttributesKeys.CanSeek] = "0";        

   }        

    List<MediaStreamDescription> mediaStreamDescriptions = new List<MediaStreamDescription>();        

    mediaStreamDescriptions.Add(this.videoStreamDescription);

    this.ReportOpenMediaCompleted(mediaSourceAttributes, mediaStreamDescriptions);   

   }

 

       第二个问题是在关于在模拟器上能显示视频图像,但是真机中不能显示的问题,直接的现象就是怎么也不进GetSampleAsync这个接口!网上查了很久,好多老外也为这个问题纠结额,解决方法也是无意尝试中得知:就是OpenMediaAsync这个方法中的一句话需要改变下而已,呜呜,天杀的!将videoStreamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = ""的值改成你H264裸码流第一帧中的SPS+PPS,类似于videoStreamAttributes[MediaStreamAttributeKeys.CodecPrivateData] = "000001674D4015965301004A2000000168E9238800",具体根据你的实际数值而定。

        无论如何,解码H264裸数据的问题总算解决了,接下来的必定还有好多未知的难题待解,戒骄戒躁,继续加油咯!

转载于:https://www.cnblogs.com/lilipangtou/archive/2012/05/07/2487792.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值