当前位置: 首页 > article >正文

使用libmpeg解码mp3格式文件

mp3格式的数据是通过udp循环从硬件发送过来的

#define BUFF_SIZE 1024
//定义线程锁
static std::mutex decodelock;
std::condition_variable dataAvailable;
	//mpg123的初始化
	mpg123_init();
    int err;
    mh = mpg123_new(NULL, &err);
    if (mh == NULL) {
        qDebug() <<  "Error initializing mpg123: " << mpg123_plain_strerror(err);
        return;
    }
    //设置参数
    mpg123_param(mh,MPG123_ADD_FLAGS,MPG123_FORCE_STEREO,100);
    mpg123_open_feed(mh);

void AudioCode::MP32PCM()
{
    int buff_size = BUFF_SIZE;
    unsigned char *buffer = (unsigned char *)malloc(buff_size);
    size_t frame_offset = 0;
    qInfo() << "start decode";
    while (che) {
        if(mp3DataAll.length() > BUFF_SIZE){
            std::unique_lock<std::mutex> lock(decodelock);
            dataAvailable.wait(lock);

            QByteArray array = mp3DataAll.left(BUFF_SIZE);
            mp3DataAll.remove(BUFF_SIZE);
            if (mpg123_feed(mh,reinterpret_cast<const unsigned char *>(array.data()), array.size())!= MPG123_OK) {
                qDebug() << "Error feeding data to mpg123: %s\n" << mpg123_strerror(mh);
                continue;
            }
            while (mpg123_read(mh, buffer, buff_size, &frame_offset) == MPG123_OK) {
                audioDeviceO->write(reinterpret_cast<const char *>(buffer),buff_size);
            }
        }
    }
    qInfo() << "end decode";
    free(buffer);
    mpg123_close(mh);
    mpg123_delete(mh);
    mpg123_exit();
    return;
}
//udp接收数据
void AudioCode::processDatagrams(){

    while (socket->hasPendingDatagrams()) {
        connectState = false;
        emit sendConnectState(connectState);
        timer->start(CONNECT_TIME);
        QByteArray datagram;
        datagram.resize(socket->pendingDatagramSize());
        socket->readDatagram(datagram.data(), datagram.size());
        std::lock_guard<std::mutex> guard(decodelock);
        mp3DataAll += datagram;
        dataAvailable.notify_one();
        if(mp3InFILE.isOpen())
            mp3InFILE.write(datagram.data(),datagram.size());
    }
}

http://www.kler.cn/a/299729.html

相关文章:

  • Vuex中的getter和mutation有什么区别
  • HTML 标题
  • 【go语言】结构体
  • 力扣【669. 修剪二叉搜索树】Java题解
  • uniapp使用uni.navigateBack返回页面时携带参数到上个页面
  • Vue.js组件开发-实现下载动态进度条
  • OPPO 全家桶:Find X8/Pro、Pad3 Pro与Enco X3即将10月登场
  • OpenCV-模板匹配
  • 要在 Windows 系统中通过 VNC 远程连接到 CentOS 或 Ubuntu 服务器,可以按照以下步骤来配置和使用 VNC 进行远程桌面访问
  • MySQL——数据库的高级操作(一)数据备份与还原(1)数据的备份
  • 科技改变生活,IsMyLcdOK引领屏幕检测新风尚
  • Unity解析XML开发随机名字生成模块
  • SAP学习笔记 - 开发04 - Fiori UI5 开发环境搭建
  • Word文档格式设置的自动化与技巧
  • Apache SeaTunnel基础介绍
  • 南通网站建设手机版网页
  • Ajax实现一个简单的文件上传进度条
  • Python中`enumerate()`函数的作用
  • Imagination推出性能最高且具有高等级功能安全性的汽车GPU IP
  • 搜维尔科技:TechViz 虚拟会议室-多人协同混合现实协作
  • 使用切换 JDK 的方式优化部署微服务占用内存过高的问题
  • 微信小程序中数值计算的精度丢失问题
  • ”CSS 网格“二维布局系统(补充)——WEB开发系列32
  • 深度学习-目标检测(二)Fast R-CNN
  • HCIA--实验十:路由的递归特性
  • 【C++】STL——vector中的迭代器失效问题