海思开发板wince平台实现照相机功能

49 篇文章 11 订阅
10 篇文章 4 订阅

如下是一年多前某个项目的开发经验:

 

平台 Hi3611 win mobile6,视频数据通过camera采集,camera驱动是别人做好的,

采集的是 640*480 高清的VGA视频。

音频数据通过普通的话筒采集, 2声道,44100采样率,16位。

使用DirectShow和DirectDraw技术。

DirectDraw主要是在预览中发挥作用,

DirectShow基本步骤:Source Filter -> Transform filter -> Render filter

整个音视频数据采集过程就在跟过滤器(filter)打交道。

source filter就是采集源,具体就是camera和话筒,从source filter获得原始的音视频数据。

接着在 transform filter 中做进一步的处理,比如压缩编码或者按照自己的需求修改视频数据等等。

render filter就是最终目标,比如压缩后的音视频数据写到文件中,或者预览的视频数据,直接显示到屏幕上。

我的目标是把采集到的视频数据按照H263压缩,音频按照AAC压缩,然后写到MP4文件中,

因为之前没这方面的经验,于是最早采用wince默认自带的WMV9软编码,结果压缩不到10秒,机器就死了。

刚开始还以为是自己代码没写正确, 多次尝试,基本上折腾了快一周,最终发现,机器内存不断下降,直到全吃光,

然后恍然明白:在小机器上,使用软编码压缩音视频数据,基本上是行不通的,因为受限于小机器的CPU速度,

毕竟小机器不同于PC机。

这些小机器上,是有专门的硬件芯片,在做音视频数据压缩,这个就是通常所说的硬编码。

市面上各种手机以及凡是能播放电影的小设备,无疑都集成有硬编码芯片,否则压根就播放不了电影。

明白了这点,就好办多了,然后跟硬件厂商联系,获得开发板上多媒体硬编码的接口函数以及相关代码。

到目前为止,视频编码和音频编码filter都要自己开发, 还有写mp4文件的filter也要自己开发。

而我没有按照微软的思路来做, 这样又是写video/audio encoder filter,又是写 mux MP4 file filter,简直是给自己找麻烦,

而且还要写一个自定义filter,修改视频数据(主要是添加一些文字信息)。

很简单的想法: 从source filter出来的原始音视频数据直接送到自己写的一个render filter里,

在render filter修改视频数据,硬编码,写MP4文件,送预览视频数据到屏幕:一起来完成。

在render filter里定义一个回调函数,供外边的接口调用,

在回调函数里,修改视频数据,修改我是先开辟一个小矩形BITMAP,获得HDC,写文字,

接着把这个小矩形的RGB24数据转成YV12,接着利用某种算法贴到原来视频数据上,结果显示效果不错,速度也挺快。

在回调函数里,同时把视频数据直接送到显存里,主要是DirectDraw的功劳。

等回调函数处理完成后,送到硬编码芯片,进行H263编码,

音频数据直接送去编码,进行AAC-LC编码, 之后,把这2种流,混合起来,写到MP4文件中,

其实现在回过头来想想,也不是太难,关键是会者不难。

当然这里边还有许多的技术细节需要解决,

比如音视频同步问题,写文件格式好像不大对,我正在找别的开源库,

比如正在尝试移植著名的ffmpeg开源代码到wince平台。

预览部分,我先使用GDI画图,结果可想而知,最后使用DirectDraw,

因为是在回调函数中获得是 YV12数据,所以实际使用的 Overlay平面,专门处理视频显示的一种平面。


大概就写这么多吧,有时间把上边的处理思路,用在windows平台上,

windows平台使用ffmpeg做H263软编码和写mp4文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值