• Ubuntu 下使用蓝牙/USB连接黑莓8700上网

    December 18, 2009

    黑莓8700支持EDGE网络,用来做GPRS Modem是相当理想的,标准的mini usb接口,蓝牙2.0,完全足够EDGE的网络速度; 本来以为用蓝牙连接会很简单,在blueman里面连接即可,可是实际上,不行: Failed: Modem Manager did not support the connection 之前用blueman连接Nokia的机,是没问题的,看来黑莓的Modem协议有点不同……Google了一下,找到了不少BB在Linux下的资料:How use BlackBerry device with Linux【介绍了Linux对黑莓的配置、同步、安装软件、Modem、Java开发】how to teather blackberry and linux via bluetooth【连BB蓝牙的完整过程,试验不成功】Berry4all 通过USB连接BB Modem的专用程序 测试Berry4all终于能够连接上BB的GPRS,观察Berry4all其实也是建立了串口通信后,使用pppd的协议来建立数据链接的,要连接cmnet,还得修改其conf下的att-chat,即其中的“拨号”协议; blueman虽然不能建立Modem链接,但是还是能够建立起/dev/rfcomm0,即通过蓝牙的串口链接;使用蓝牙教程,基本上都是使用hcitool等工具来配置的,使用起来真的好不方便,而blueman不是刚好帮忙搞定了蓝牙的配对连接等麻烦事情么…… 于是把Berry4all的conf目录的att跟att-chat文件复制到/etc/ppp/peers,参照别的教程的配置,修改att,在开始115200那行前,加入nodetach跟/dev/rfcomm0两行,最后的connect调用chat文件的路径改成connect "/usr/sbin/chat -f /etc/ppp/peers/att-chat",att-chat里面修改一行:OK 'AT+CGDCONT=1,"IP","cmnet"' ,最后运行sudo pppd call att,终于用蓝牙连上了GPRS; 其实使用ppp连接modem的方法是最传统的,也是高度可定制(如连接后配置路由表、IP、DNS),不管是用Cable、USB、蓝牙还是红外,都可以这样完成,Of Linux, GPRS Phones, Serial Cable, Irda, Bluetooth and USB文章里面列举了好多这些例子;我修改了其中的三个脚本:gprs, gprs-connect-chat, gprs-disconnect-chat替代了上面Berry4all的att脚本,因为这脚本里面的注释非常详细,以防以后需要的调整; 这是我打包了修改好后(适用于移动CMNET上网的)gprs脚本,使用blueman连接了rfcomm0后,运行sudo pppd call gprs,就能连接上GPRS,ifconfig查看出现一个ppp0,可以直接上网了; 如果不使用blueman,完全使用bluez的工具的话,可以参照Blackberry [...]

  • ffmpeg API 笔记:使用libavcodec/libavformat/libswscale

    December 11, 2009

    Update 2010.1.5: 其实研究ffmpeg不用找什么教程,第一步应该是下载ffmpeg的源码包。下面提到的An FFmpeg and SDL Tutorial确实有讲解,但是教程总是跟不上代码的变化的,所以直接看可工作代码最好;ffmpeg的结构很分明,后台是几个库:libxxx,前台是三个程序ffmpeg, ffplay, ffserver,那篇教程说的就是ffplay的实现。一个播放器,其实重点不是解码,解码的东西是lib去做的,主要是做声音视频的时钟同步。ffplay的代码可以说是一个可用播放器最简单的实现了,源码里面有个output_example.c,可以说是最基本的api示范吧。ffmpeg是转换编码解码转换程序,因为涉及重新采样等等,所以代码量也不少的。 这两天"调研"了下ffmpeg的API,不得不承认被雷倒:ffmpeg又是一个很geek的项目,纯社区开发,基于逆向,功能强大,但是文档极度有限,想了解API?看源码去…… 网上关于ffmpeg API的资料,无非是ffmpeg文档里面的两个链接,Using libavformat and libavcodec byMartin Böhme(以及其Update,介绍了新引入的API)跟An FFmpeg and SDL Tutorialby Stephen Dranger;两个tutorial基于ffmpeg 0.4.8,现在ffmpeg发布的版本是0.5.0,好像数值相差不大,不过0.4.8是5年前的了(相比之下wine用了15年版本号才到达1.0,有过之余无不及),两个教程里面的代码在0.5.0下一编译,哇,一堆错误,可不仅有些api函数变了,有些结构成员压根就没了,头文件的位置更是不一样(各个库分家了)……所以我调试了好几个小时,终于把例子的代码弄好(其实Martin Böhme那篇有一段09年加入的更新说明,链接了有相关的解决办法,我一开始没注意,几个小时自己解决,不过也有收获)。 最后我调试好的代码流程:打开一个视频文件,抓取前5帧保存为文件;【基于Stephen Dranger的Tutorial1】源码在此:GoogleCode av_register_all();//初始化ffmpeg库,如果系统里面的ffmpeg没配置好这里会出错 av_open_input_file(); av_find_stream_info();//查找文件的流信息 dump_format();//dump只是个调试函数,输出文件的音、视频流的基本信息了,帧率、分辨率、音频采样等等 for(...);//遍历文件的各个流,找到第一个视频流,并记录该流的编码信息 sws_getContext();//根据编码信息设置渲染格式 avcodec_find_decoder();//在库里面查找支持该格式的解码器 avcodec_open();//打开解码器 pFrame=avcodec_alloc_frame();//分配一个帧指针,指向解码后的原始帧 pFrameRGB=avcodec_alloc_frame();//分配一个帧指针,指向存放转换成RGB后的帧 avpicture_fill(pFrameRGB);//给pFrameRGB帧加上分配的内存; while true{ av_read_frame();//读取一个帧(到最后帧则break) avcodec_decode_video();//解码该帧 sws_scale();//把该帧转换(渲染)成RGB SaveFrame();//对前5帧保存成ppm图形文件(这个是自定义函数,非API) av_free_packet();//释放本次读取的帧内存 } avcodec_close(); av_close_input_file(); 用到的API就这么多,当然实际代码稍复杂一点;ppm图像是类似BMP的非压缩格式,SaveFrame就是相当于把pFrameRGB的内存拷贝进文件,写文件并不复杂; 调试过程的问题,首先是头文件,ffmpeg 0.5.0的API已经拆分成好几个独立的库,用pacman -Ql ffmpeg看了下文件分布,在include下好几个目录都是它的,看名字可以大概猜出他们的功能: libavcodec:CODEC其实是Coder/Decoder的缩写,也就是编码解码器;libavdevice:对输出输入设备的支持;libavformat:对音频视频格式的解析libavutil:集项工具;libpostproc:后期效果处理;libswscale:视频场景比例缩放、色彩映射转换; 修改好头文件包含,终于少了些not [...]

Page optimized by WP Minify WordPress Plugin

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org