在Windows Phone 7上获取原始摄像头数据

此篇文章只是拾人牙慧而已,顺带总结过程避免浪费脑细胞。过程比较曲折,也希望遇到的各种问题和错误解决过程能给后来的同学们省时间。

周末拿到HD7后一直在摆弄,发现了一个可以使用对焦摄像头的第三方程序,还有大名鼎鼎的ZXing Barcode的WP7移植版。当时觉得奇怪,因为按照之前看过的教程来看,微软开放出来的摄像头接口只有一个PhotoTask,作用是切换到内置摄像头程序,等用户拍照完毕后返回照片数据,无法直接在程序中打开摄像头查看图像。于是祭出神器Reflector查看,它用到了Microsoft.Phone.Media.Extended.PhotoCamera和VideoCamera类。然后通过ZXing的代码验证,确实如此。

打开VS2010 Express创建工程,却发现根本没有这类——连Microsoft.Phone.Media.Extended这个程序集都没有。顺藤摸瓜找到了Den Delimarsky写的两篇文章Not your regular photo and video camera on Windows Phone 7和How VideoCamera/PhotoCamera content is saved on Windows Phone 7,前一篇介绍了如何使用PhotoCamera和VideoCamera进行摄像头图像实时显示,后一篇则是介绍怎么取到拍照后的数据,写得很棒,通俗易懂。文章中提到:

通过反射调用摄像头比较慢而且增加多余的代码。所以我转而使用GAC程序集“GAC_Microsoft.Phone.Media.Extended_v7_0_0_0_cneutral_1.dll”,由于是托管代码,所以就不用加上WMInteropManifest.xml文件(或者<Capability Name=”ID_CAP_INTEROPSERVICES”/>)了。

并且提供了GAC Dump(可以看作未开放API程序集的集合)下载。不过没有详细教程,于是搜了一下实现GAC Dump的牛人Thomas Hounsell的Blog,找到了方法 Avoiding Reflection: Adding the InteropServices library to the WP7 SDK。总结起来很简单:

首先下载Hounsell那篇文章里面的7z文件。

捡自己需要的放到C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone,记得改名,把前后下划线前的内容都去掉。比如对于原生摄像头,我们需要Microsoft.Phone.Media.Extended.dll。

打开RedistList文件夹里面的FrameworkList.xml文件,记得用管理员权限。新增一个File标签(复制之前的就行),程序集名改成你刚刚加入的那个dll的,去掉publicKeyToken属性。保存。

于是我欣然照做(后来尝试发现,对于InteropServices需要这么做,但Media.Extended似乎不用,dll扔过去就可以了),结果……

搞屁啊……连设计器都打不开了!只好再搜,找到个帖子[Q] Usage of Microsoft.Phone.Media.Extended,问题类似,都是“强名称验证失败”,不过帖子中还能打开设计器而运行时出现COMException:

解决方法很简单,利用Window SDK的工具sn.exe执行下面的命令跳过验证,看到后面的信息即可(也要用管理员权限,或者从VS命令行执行):

sn.exe -Vr [dll path]

Verification entry added for assembly ‘Microsoft.Phone.Media.Extended,24EEC0D8C86CDA1E’

有关强名称和sn.exe的信息可以参看具有强名称的程序集强名称工具 (Sn.exe)。简单说来强名称就是带有唯一公钥信息的程序集,好处是可以验证程序集的可靠性以及dll名字可以随便改。但坏处就是现在遇到的问题了:每台机器的.net环境都需要强名称程序集验证后才能使用。

其实这个地方还是衰了一下,因为我发现Windows Phone Developer Tools中的Visual C# Express并没有传说中的sn.exe(靠……),于是又跑到微软网站上下了个Visual C++ Express 2010,这才彻底搞定。如果你直接装了Pro版那就没这个困扰了。

最后再说一下有关PhotoCamera的使用。首先建议详读Den Delimarsky那两篇文章,基本覆盖了所有使用和可能碰到的问题。除了里面提到的API外,还有个比较有用的是GetCurrentFrame()。这个函数接受一个WritableBitmap参数,尺寸一定要是640 x 480,不然会有异常抛出来。另外拿到的WritableBitmap最好不要尝试通过ImageBrush画出来,不然会慢死(模拟器上大概200ms处理一帧,真机也就500ms)。下面截图就是模拟器的效果,大的白色区域(加那个黑方块)是原生的View Finder,左上角的是通过GetCurrentFrame()后重新画的。

21 Responses to “在Windows Phone 7上获取原始摄像头数据”

  1. Cell Phone说道:

    I do not even know the way I ended up here, however I believed this publish was once good. I don’t recognize who you’re however definitely you are going to a famous blogger when you are not already. Cheers!

  2. ブルガリ偽物 財布
    の石ではマズイのでしょVpc http://ameblo.jp/ijinda67/entry-11978915830.html

  3. ブルガリ財布 コピー
    式HPを参考にして下さZsD http://penneso1986.blog.jp/archives/20913960.html

  4. ブルガリ財布 スーパーコピー
    ブルガリ 財布 偽物 http://nukenpu1972.blog.jp/archives/20911905.html

  5. What i don’t understood is in reality how you are no longer really much more smartly-liked than you may be right now. You are so intelligent. You already know therefore considerably in terms of this subject, made me in my view believe it from numerous various angles. Its like men and women aren’t fascinated except it’s one thing to do with Woman gaga! Your own stuffs outstanding. Always care for it up!

  6. 第一给飞机装一个降落伞,在离地面太高的时候出事时使用.第二发明一个像气球原理的东西,飞机离地面比较近的时候打开。使飞机不会重击在地面。
    昌平网站建设 http://www.cpwzjs.cn/

  7. 这说的有道理啊,民航客机配备降落伞只会让本来就低的可怜的生还几率直接降为0,你认为慌乱中的旅客会听从指挥一个一个的从指定出口跳下去?还是指望旅客都是跳伞爱好者,有足够的经验来控制降落伞?再说了,就算忽略飞机发动机的威胁,1万米的高空,跳出去不被气流吹晕也会被活活冻死
    街道口网站建设 http://www.Jdkwzjs.cn

  8. 加油,我的祖国,拿出实力说话,我们不惧怕美日帝国主义!!
    我本沉默传奇私服 https://www.wobenchenmo.com.cn/

  9. 好兴奋哦~终于有自己制造的国产航母了~中过万岁~!这只是万里长征第一步加油中国~期待真正的全国产航母
    汉街网站建设 http://www.Hjwzjs.cn

  10. 应县门户网说道:

    有关部门醒醒吧,别再万税,万税,万万税啦,国人都跑日本去了,日货再便宜再好我也不会买,宁可多花钱买别的。
    应县门户网 http://www.yingxian.org.cn/

  11. 你妈的!中国懦夫领导人还不出手么?哥都隐不住了,我要打飞机射死菲佣!
    江岸网站建设 http://www.jawzjs.com.cn

  12. 你们是什么眼光啊没看到吗中国和俄罗斯正在玩双管齐下吗,清理周边障碍吗,这都看不出来
    九资河门户网 http://www.jiuzihenews.cn/

  13. 后果虽然惨烈,但和日本多少年来不共戴天,顶你的话
    兴义市全盈商贸有限公司 http://www.cnLianguo.com

  14. 我也鄙视这种吃中国的粮食放洋屁的,身为一个中国人,你没资格指责自己的国家,就像你指责你老爸不该和你老妈生你一样的道理。
    黄陂网站建设 http://www.Hpwzjs.cn

  15. 说穿了就是中美同时在两个地区开战,美帝试试吧!中国怕你们这些狗列强的日子过去了!永远过去了?
    广州双城热恋创意文化传播有限公司 http://www.666Loveyou.com

  16. MSeerveisyqy说道:

    [url=https://flexeril.store/]order flexeril generic[/url]