#include "IoContext.h" #include "main.h" #include #include void PlayerTask::setPath(const std::string &path) { if (m_path != path) { m_path = path; } if (std::filesystem::exists(path)) { m_ifs = std::make_shared(path, std::ifstream::binary); } } void PlayerTask::setChannels(int channels) { if (m_channels != channels) { m_channels = channels; } } /* ffmpeg将一个1通道mp3文件,转换为 2通道,16bit,16000采样率的pcm文件,但是左通道数据为静音 ffmpeg -i 20200316_1900.mp3 -ac 2 -ar 16000 -filter_complex "[0:a]pan=stereo|c0=0*c0|c1=1*c0[a]" -map "[a]" -f s16le -acodec pcm_s16le 20200316_1900.pcm ffmpeg将一个1通道mp3文件,转换为 2通道,16bit,16000采样率的pcm文件,但是右通道数据为静音 ffmpeg -i 20200316_1900.mp3 -ac 2 -ar 16000 -filter_complex "[0:a]pan=stereo|c0=1*c0|c1=0*c0[a]" -map "[a]" -f s16le -acodec pcm_s16le 20200316_1900.pcm ffmpeg -i 20200316_1900.mp3 -ac 2 -ar 16000 -f s16le -acodec pcm_s16le 20200316_1900_2ch.pcm ffmpeg -i 20200316_1900.mp3 -ac 1 -ar 16000 -f s16le -acodec pcm_s16le 20200316_1900_1ch.pcm 20200316_1900.mp3 ./Record --play --channels=1 --path=/sdcard/data/20200316_1900_1ch.pcm ./Record --play --path=/sdcard/data/20200316_1900_2ch.pcm ./Record --play --path=/sdcard/data/20200316_1900_left_silence.pcm ./Record --play --path=/sdcard/data/20200316_1900_right_silense.pcm 20240904160913.pcm */ // ./Record --play --path=/sdcard/data/20240904160913.pcm void PlayerTask::run() { using namespace Amass; RkAudio::Format format; format.channels = m_channels; format.period = 64; m_output = std::make_shared(); if (!m_output->open(sizeof(uint16_t), format.sampleRate, format.channels, format.period, false)) { LOG(error) << "audio output open failed."; return; } m_buffer.resize(m_channels*sizeof(int16_t)*16* format.period); play(); } void PlayerTask::play() { using namespace Amass; auto ioConext = Singleton::instance(); if (!m_ifs || !(*m_ifs)) { LOG(info) << "play finished"; return; } m_ifs->read(m_buffer.data(), m_buffer.size()); auto readedSize = m_ifs->gcount(); m_output->write(reinterpret_cast(m_buffer.data()), readedSize); boost::asio::post(*ioConext->ioContext(), [this]() { play(); }); }