qtopia2加入aac音频解码功能

板子helper2416    芯片是三星的s3c2416  arm平台   本机系统: opensuse

qtopia2.2中的播放mp4视频没有声音, 后来发现是没有aac音频解码

这就得从ffmpeg的源码中入手了,源码中有带了faac.c(编码), faad.c(解码),但是没有编译进去


进入目录
qtopia/src/3rdparty/libraries/libavcodec
查看版本
avcodec.h
// 可知对应ffmpeg的版本号
#define FFMPEG_VERSION_INT     0x000409
#define FFMPEG_VERSION         "0.4.9-pre1"
#define LIBAVCODEC_BUILD       4757


我们只要解码的,用来播放声音
faad.c
#include "avcodec.h"
#include "faad.h" // 这个头由faad库提供  得另外编译的


allcodecs.c
#ifdef CONFIG_FAAD
#ifdef CONFIG_AAC_DECODER
    register_avcodec(&aac_decoder);
#endif //CONFIG_AAC_DECODER


要使能aad解码就得定义CONFIG_FAAD 与CONFIG_AAC_DECODER 两个宏


libavcodec.pri
CONFIG_VORBIS_DECODER
改成
CONFIG_VORBIS_DECODER \
CONFIG_FAAD \
CONFIG_AAC_DECODER 


libavcodec.pro
contains(DEFINES,CONFIG_VORBIS_DECODER) {
    SOURCES     += vorbis.c
}
的后面加上


#JYX_MODI add
contains(DEFINES,CONFIG_AAC_DECODER) {
    SOURCES     += faad.c
    INCLUDEPATH +=  ../libfaad2 
    PACKAGE_DEPENDS += libfaad2
    LIBS    += -lfaad 
}


现在来把faad整合进去
faac库
http://www.audiocoding.com/faac.html
下载faad2-2.7.tar.bz2
解压faad
tar -xvf faad2-2.7.tar.bz2
cd faad2-2.7
./configure --host=arm-linux
cp include/* config.h libfaad/
修改libfaad/common.h
38行
#ifdef HAVE_CONFIG_H
#  include "../config.h"
#endif

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif


挎贝到qtopia源码目录中
cp libfaad/ ~/workspace/qtopia2.2/qtopia/src/3rdparty/libraries/libfaad2 -r
在libfaad2下新建个libfaad2.pro
TEMPLATE    =   lib
CONFIG      -=  qt
CONFIG      -= warn_on


INCLUDEPATH +=  ./
DEPENDPATH      += ./ 
DEFINES += HAVE_CONFIG_H


SOURCES += bits.c cfft.c decoder.c drc.c \
             drm_dec.c error.c filtbank.c \
             ic_predict.c is.c lt_predict.c \
             mdct.c mp4.c ms.c output.c pns.c \
             ps_dec.c ps_syntax.c \
             pulse.c specrec.c syntax.c tns.c hcr.c huffman.c \
             rvlc.c ssr.c ssr_fb.c ssr_ipqf.c common.c \
             sbr_dct.c sbr_e_nf.c sbr_fbt.c sbr_hfadj.c sbr_hfgen.c \
             sbr_huff.c sbr_qmf.c sbr_syntax.c sbr_tf_grid.c sbr_dec.c


TARGET          =   faad
DESTDIR     =   $$(QPEDIR)/lib
VERSION     =   2.0.0
PACKAGE_NAME    = libfaad2




qtopia/src/general.pri
约187行处
contains(PLUGIN_PROJECTS,3rdparty/plugins/codecs/libffmpeg) {
    LIBRARY_PROJECTS+=\
    3rdparty/libraries/libavcodec\
    3rdparty/libraries/libavformat
}
改成


contains(PLUGIN_PROJECTS,3rdparty/plugins/codecs/libffmpeg) {
    LIBRARY_PROJECTS+=\
    3rdparty/libraries/libfaad2 \
    3rdparty/libraries/libavcodec\
    3rdparty/libraries/libavformat
}


qtopia/src/projects.pri
37行
    LIBRARY_PROJECTS -= 3rdparty/libraries/libavcodec \
        3rdparty/libraries/libavformat \
        3rdparty/libraries/amr


改成
    LIBRARY_PROJECTS -= 3rdparty/libraries/libavcodec \
        3rdparty/libraries/libavformat \
        3rdparty/libraries/libfaad2 \
        3rdparty/libraries/amr


84行处
    # only used with ffmpeg/amr
    !contains(PLUGIN_PROJECTS,3rdparty/plugins/codecs/libffmpeg) {
    !contains(PLUGIN_PROJECTS,3rdparty/plugins/codecs/libamr):LIBRARY_PROJECTS-=3rdparty/libraries/amr
    LIBRARY_PROJECTS-=3rdparty/libraries/libavcodec\
        3rdparty/libraries/libavformat
    }
改成
    # only used with ffmpeg/amr
    !contains(PLUGIN_PROJECTS,3rdparty/plugins/codecs/libffmpeg) {
    !contains(PLUGIN_PROJECTS,3rdparty/plugins/codecs/libamr):LIBRARY_PROJECTS-=3rdparty/libraries/amr
    LIBRARY_PROJECTS-=3rdparty/libraries/libavcodec\
        3rdparty/libraries/libfaad2 \
        3rdparty/libraries/libavformat
    }

 

重新编译就可以了. 更新了libfaad 与libavcodec, 如果有段错误,则libavcodec工程需要clean后再编译

Qt

1. Qt框架概述

Qt是一个跨平台的C++应用程序开发框架,广泛用于开发GUI程序、嵌入式系统、移动应用及企业级软件。其核心优势包括:

  • 跨平台支持: Windows/Linux/macOS/Android/iOS/嵌入式系统。
  • 模块化设计: 提供GUI、网络、数据库、多媒体等独立模块。
  • 信号槽机制: 独特的对象间通信方式(取代回调函数)。
  • 开源与商业双许可: LGPLv3或商业许可。

2. Qt核心模块

模块名功能描述
Qt Widgets传统桌面GUI组件(按钮、窗口等),基于CPU渲染
Qt Quick现代UI框架(QML语言+JavaScript),支持硬件加速,适合动态界面
Qt NetworkTCP/UDP/HTTP等网络通信功能
Qt SQL数据库访问(支持MySQL/PostgreSQL/SQLite等)
Qt Multimedia音视频播放与录制
Qt WebEngine基于Chromium的浏览器引擎

3. Qt开发模式对比

(1) Qt Widgets (传统C++方式)
  • 适用场景: 复杂桌面应用(如IDE、工业软件)
  • 代码示例:
// C++创建窗口
#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QPushButton button("Hello Qt!");
    button.show();
    return app.exec();
}
(2) Qt Quick (QML声明式UI)
  • 适用场景: 移动端/嵌入式触控界面、动画密集型应用
  • 代码示例:
// QML定义界面
import QtQuick 2.0

Rectangle {
    width: 200; height: 100
    Text { text: "Hello QML!"; anchors.centerIn: parent }
}

4. Qt信号槽机制

Qt的核心通信机制,相比回调函数的优势:

  • 类型安全: 编译时检查参数类型。
  • 松耦合: 发送者无需知道接收者存在。
  • 示例代码:
// C++中连接信号与槽
QObject::connect(
    sender, &Sender::valueChanged, //信号
    receiver, &Receiver::updateValue //槽
);

// QML中信号处理
Button {
    onClicked: { console.log("Clicked!") } //内置信号处理器
}


5. Qt跨平台开发实践

(1) 平台特定代码处理
#ifdef Q_OS_WIN
    // Windows专用代码
#elif defined(Q_OS_ANDROID)
    // Android专用代码
#endif

(2) 响应式UI设计
  • DPI适配:
Text { font.pixelSize: Qt.application.font.pixelSize * 1.5 }
  • 多语言支持.ts文件 + lupdate/lrelease工具链。

6. Qt与Android/iOS集成

(1) Android开发注意事项
  • 部署配置:
android {
    QT += androidextras
    ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
}
  • Java互操作:
QAndroidJniObject::callStaticMethod<void>(
    "org/qtproject/example/JavaClass",
    "showToast",
    "(Landroid/content/Context;Ljava/lang/String;)V",
    QtAndroid::androidContext(),
    QAndroidJniObject::fromString("Hello from Qt!").object()
);
(2) iOS开发限制
  • App Store要求使用Metal渲染器(Qt默认支持)。

7. Qt性能优化技巧

  1. 内存管理:
    • QObject派生类自动父子内存管理。
    • 避免在QML中创建过多动态对象。
  2. 渲染优化:
    • Widgets应用启用QT_QUICK_BACKEND=software回退。
    • Quick应用使用ShaderEffectSource复用纹理。

8. Qt6新特性

  • 重大改进:
    • CMake成为默认构建系统(替代qmake)。
    • QML强类型系统(required properties)。
  • 模块变化:
    • Qt Quick Controls移出主仓库。
    • OpenGL替换为RHI(Render Hardware Interface)。

9. Qt应用案例

  • 知名产品:
    • Autodesk Maya (3D建模)
    • Tesla车载UI
    • WPS Office (Linux版)
  • 行业应用:
    医疗设备GUI、工业控制系统、智能家居中控。

10.学习资源推荐

  1. 官方文档
  2. 《C++ GUI Programming with Qt4/5》
  3. Qt官方示例(安装包自带)

通过掌握Qt的核心机制和跨平台策略,开发者可以高效构建高性能的现代应用程序。建议从Qt Widgets入门,再逐步学习Qt Quick以满足不同场景需求。

 作者:帅得不敢出门   c++哈哈堂群:31843264  转载请保留此信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值