【开发日志】2022.09.02 ZENO zenoplayer_main Update

这篇博客主要介绍了如何使用ZenoPlayer进行音视频处理。通过QCommandLineParser解析命令行参数,设置ZenoPlayer的各项配置,如播放音频、记录帧数等。同时,文章详细展示了针对.wav和.mp3文件的帧数计算方法。此外,还涵盖了ZenoPlayer的初始化参数及风格设定。
摘要由CSDN通过智能技术生成
#include <QApplication>
#include <QCommandLineParser> 
#include "zenoplayer.h"
#include "zenoapplication.h"
#include "style/zenostyle.h"
#include "zeno/extra/assetDir.h"
#include <zeno/utils/logger.h>
#include "AudioFile.h"
#define MINIMP3_FLOAT_OUTPUT
#include "minimp3.h"

static int calcFrameCountByAudio(std::string path, int fps) {
    //auto *pFlie;
    auto *pFile = strrchr(path.c_str(),'.');
    if(pFile !=NULL) {
        if (strcmp(pFile, ".wav") == 0) {
            AudioFile<float> wav;
            wav.load(path);
            uint64_t ret = wav.getNumSamplesPerChannel();
            ret = fps * ret / wav.getSampleRate();
            return ret + 1;
        }

        else if (strcmp(pFile, ".mp3") == 0) {
            std::ifstream file(path, std::ios::binary);
            auto data = std::vector<uint8_t>((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
            static mp3dec_t mp3d;
            mp3dec_init(&mp3d);
            mp3dec_frame_info_t info;

            float pcm[MINIMP3_MAX_SAMPLES_PER_FRAME];
            int mp3len = 0;
            int sample_len = 0;

            while (true) {
                int samples = mp3dec_decode_frame(&mp3d, data.data() + mp3len, data.size() - mp3len, pcm, &info);
                if (samples == 0) {
                    break;
                }
                sample_len += samples;
                mp3len += info.frame_bytes;
            }
            uint64_t ret = sample_len / info.channels;
            ret = ret * fps / info.hz;
            return ret + 1;
        }
    }
}

int main(int argc, char *argv[]) 
{
    ZenoApplication a(argc, argv);
    a.setStyle(new ZenoStyle);

    a.setWindowIcon(QIcon(":/icons/zenus.png"));

    //QMessageBox::information(NULL, "debug", "debug");
	
    ZENO_PLAYER_INIT_PARAM param;
    if (argc > 1)
    {
        QCommandLineParser cmdParser;
        cmdParser.addHelpOption();
        cmdParser.addOptions({
            {"zsg", "zsg", "zsg file path"},
            {"record", "record", "Record frame"},
            {"frame", "frame", "frame count"},
            {"sframe", "sframe", "start frame"},
            {"sample", "sample", "sample count"},
            {"pixel", "pixel", "set record image pixel"},
            {"path", "path", "record dir"},
            {"audio", "audio", "audio path"},
            {"bitrate", "bitrate", "bitrate"},
            {"fps", "fps", "fps"},
            {"configFilePath", "configFilePath", "configFilePath"},
            {"exitWhenRecordFinish", "exitWhenRecordFinish", "exitWhenRecordFinish"},
        });
        cmdParser.process(a);
        if (cmdParser.isSet("zsg"))
            param.sZsgPath = cmdParser.value("zsg"); 
        if (cmdParser.isSet("record"))
            param.bRecord = cmdParser.value("record").toLower() == "true";
        if (cmdParser.isSet("frame"))
            param.iFrame = cmdParser.value("frame").toInt();
        if (cmdParser.isSet("sframe"))
            param.iSFrame = cmdParser.value("sframe").toInt();
        if (cmdParser.isSet("sample"))
            param.iSample = cmdParser.value("sample").toInt();
        if (cmdParser.isSet("pixel"))
            param.sPixel = cmdParser.value("pixel");
        if (cmdParser.isSet("path"))
            param.sPath = cmdParser.value("path");
        if (cmdParser.isSet("configFilePath")) {
            param.configFilePath = cmdParser.value("configFilePath");
            zeno::setConfigVariable("configFilePath", param.configFilePath.toStdString());
        }
        if (cmdParser.isSet("exitWhenRecordFinish"))
            param.exitWhenRecordFinish = cmdParser.value("exitWhenRecordFinish").toLower() == "true";
        if (cmdParser.isSet("audio")) {
            param.audioPath = cmdParser.value("audio");
            if(!cmdParser.isSet("frame")) {
                int count = calcFrameCountByAudio(param.audioPath.toStdString(), 24);
                param.iFrame = count;
            }
        }
        param.iBitrate = cmdParser.isSet("bitrate")? cmdParser.value("bitrate").toInt(): 20000;
        param.iFps = cmdParser.isSet("fps")? cmdParser.value("fps").toInt(): 24;
    }
    zeno::log_info("ZsgPath {} Record {} Frame {} SFrame {} Sample {} Pixel {} Path {}",
                   param.sZsgPath.toStdString(), param.bRecord, param.iFrame, param.iSFrame, param.iSample,
                   param.sPixel.toStdString(), param.sPath.toStdString());
	ZenoPlayer w(param);
	w.show();
	return a.exec();
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值