2009年2月19日星期四

Qt-extended 中如何用Gstreamer支持流媒体

分析版本:qt-extended-4.4.2
默认情况下是不支持的。

调试步骤:
1.在网上找了一个实时电台的网址http://scfire-dtc-aa01.stream.aol.com:80/stream/1074
2. 用Linux自带的totem去播放能成功,这样确保了gstreamer的codec没有问题
3.上面的步骤成功的话,可以用qcop向qpe server发Service 请求,播放流文件,linux命令为
$ ./image/bin/qcop service send PlayMedia "openURL(QString)" "http://scfire-dtc-aa01.stream.aol.com:80/stream/1074"
4. 上面命令,Qtopia会提示出错,因为Mediaplayer代码中将 "http://xxxxx"变成了"file://http//xxxxx",所以没法播放
该代码在./src/libraries/qtopiamedia/qmediaplaylist.cpp文件中大概666行的地方
663 else
664 return content.fileName();
665 case QMediaPlaylist::Url:
666 return QUrl(QLatin1String("file://")+content.fileName());
667 case QMediaPlaylist::Artist:
668 return content.property( QContent::Artist );
669 case QMediaPlaylist::Album:
670 return content.property( QContent::Album );
因为只有真正的本地文件地址才需要前面的“file://”,而网络地址则
不用改变。

注意:步骤3是测试用的,你也可以写代码去openurl

2009年2月16日星期一

Qopia 中怎么编译不同的Camera

Qtopia 4.1.x系列里把和设备相关的代码独立出来放在一个专门的device目录.各位可能已经注意到了,执行
$ ls devices/
会看到下面的目录结构
example gcc411 greenphone omap730 pxa27x s3c24a0 zylonite

而不是由一大堆宏来控制,这样的好处是很好的保持了主体代码的可移植性, 另一方面也使客户很容易把精力集中在固定的一个目录下,而不是到各个目录下找到相应的代码,然后要改动,很不容易维护。在做参考设计方面,也可以只把相应的device目录打包即可

下面就以greenphone为例来讲讲camera,其实没什么特色,主要代码在
src/applications/camera 和
devices/greenphone/camera/omegacamera.cpp

后面这个文件也是要加src/applications/camera工程里编译的,我们看工程文件camera.pro
16 !isEmpty(DEVICE_CONFIG_PATH) {
17 DEVICE_SOURCES=$$files($$DEVICE_CONFIG_PATH/camera/*.cpp)
18 }
19
20 !isEmpty(DEVICE_SOURCES) {
21 SOURCES+=$$DEVICE_SOURCES
22 } else {
23 SOURCES+=defaultvideocapture.cpp
24 }
在执行 ./configue -device 的时候会生成DEVICE_CONFIG_PATH这个变量,就是前面提到的设备目录,会把相应代码加进来

至于具体的实现,就是和video4linux驱动打交道的工程,木有什么好说的,自己看代码即可

Qtopia如何管理外部存储器,如SD卡等

分析版本:qtopia-4.1.7
我们知道Linux系统中如果要访问外部存储的话,会将外部存储器视为一个block设备,并将它mount到Linux的一个文件目录,可以使操作系统很容易的访问存储器中的内容。
在支持热插拔(hotplug)的系统中,当系统检测到有外部设备接入时,会将相应事件通知操作系统。以SD卡为例,当插入SD卡时,LInux会自动的将该设备mount到一个目录,那么Qtopia就可以读取它的内容了。

我们看Qtopia是如何工作的。
$QTOPIA/src/server/stabmon.cpp中可以看到,在qtopia启动的时候会启动一些相应的服务(server),其中一个就是监视文件系统的mount变化的。和mount相关的文件有下面一些文件
/var/run/stab
/var/state/pcmcia/stab
/var/lib/pcmcia/stab
/proc/mounts Qtopia.4.x.x 使用这个
/etc/mtab Qtopia.2.x.x 使用这个
SysFileMonitor监视到以上的某个文件发生变化时,就会像qtopia的存储系统发出qcop消息
QCopEnvelope("QPE/Card", "stabChanged()" );

这个"QPE/card"通道里的"stabChanged()"会在
$QTOPIA/src/libraries/qtopia/storage.cpp 得到处理

详细内容,看代码可知

2009年2月12日星期四

Qtopia/Qt的几个培训视频

http://v.youku.com/v_show/id_XMzA4MDg0NzI=.html
http://v.youku.com/v_show/id_XMzA4MTA0NTY=.html
http://v.youku.com/v_show/id_XMzA4MTI2NjA=.html
http://v.youku.com/v_show/id_XMzA4MTM2Mjg=.html

另:DownloadHelper这个Firefox插件,可以下载youku,youtube上的视频文件,可以通过firefox自带的工具安装
Tools->Add-ons->"Get Extensions"
进入网站搜索"downloadhelper即可。



在ubuntu中使用samba服务

最简便的方法就是使用ubuntu自带工具

运行步骤
1. Applications->System->shared folders
2. 在弹出的对话框中,先选中"Unlock"按钮,然后选中"Add"去添加你要共享的目录,注意去掉那个"read only"选项
3. 最后一个步骤,在你退出这个图形工具后,将你的共享目录改成"777"属性,这样外边访问的时候就可读可写了.

访问方法 \\use.a.ip.addr

2009年2月11日星期三

qt-extended 中如何支持gstreamer 播放引擎(ubuntu)

两个条件

首先,需要系统里有gstreamer的开发库文件,在ubuntu中安装过程如下
sudo apt-get install libgstreamer0.10-dev
sudo apt-get install libgstreamer-plugins-base0.10-dev

其次,需要在配置编译过程中将gstreamer的选项使能。
../qt-extended-4.4.2/configure -mediaengines gstreamer

这样就可以编译带gstreamer的qt-extened了。
./bin/qbuild
./bin/qbuild image

在你运行qt-extended主程序的时候,如果你的Documents目录下有媒体文件,
那么进入媒体播放器找到你的媒体文件了
./bin/runqtopia

此时可能还不能播放,你需要安装gstreamer不同媒体格式的codec,比如mp3就是
sudo aptitude install gstreamer0.10-fluendo-mp3
若想知道还有哪些插件,可以用下面命令查看
aptitude search gstreamer|grep plugin

----------------------------------------------------------------
附:如果刚装好的ubuntu系统,希望能编译qt-extend-4.4 以后版本的化.
有几个先决条件.
1.最好先装好 qt-x11-4.4 以后的版本
2.一些必要的开发工具需要装
sudo apt-get install gcc g++ automake
sudo aptitude install libx11-dev libxtst-dev libxext-dev
sudo aptitude install libpng-dev

qt-4.5.0-rc1 版本中callgrindChildExitCode 未定义的问题

ftp://ftp.qtopia.org.cn/mirror/ftp.trolltech.com/qt/source/qt-x11-opensource-src-4.5.0-rc1.tar.gz

从上面网址下载的qt-x11-4.5.0的版本 ,在编译的时候会碰到callgrindChildExitCode未定义的问题,出错信息为
"qtestcase.cpp:1490: error: ‘callgrindChildExitCode’ was not declared in this scope"

原因为:在1415行定义的"int callgrindChildExitCode;" ,其代码在一个try{}代码块里面,相当于外部不可见,将其移到{}外即可。也就是把它放在1361行的地方。