HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码PCM转换为MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()
HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码PCM转换为MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()
unique_ptr<ifstream> inputFile_ = make_unique<ifstream>();
unique_ptr<ofstream> outFile_ = make_unique<ofstream>();
std::string inputFilePath = "/data/app/el2/100/base/com.example.copyfiletofilesdir/haps/entry/files/data.pcm";
std::string outputFilePath = "/data/app/el2/100/base/com.example.copyfiletofilesdir/haps/entry/files/text.mp3";
inputFile_->open(inputFilePath.data(), ios::in | ios::binary);
// 配置编码文件输出路径(此处以输出为编码码流文件为例)。
outFile_->open(outputFilePath.data(), ios::out | ios::binary);
// 开始编码
ret = OH_AudioCodec_Start(audioEnc_);
if (ret != AV_ERR_OK) {
// 异常处理
LOGE("编码失败,调用OH_AudioCodec_Start()出错");
//return "false";
}
// 每帧样点数
constexpr int32_t SAMPLES_PER_FRAME = DEFAULT_SAMPLERATE * TIME_PER_FRAME;
// 声道数,对于amr编码声道数只支持单声道的音频输入
constexpr int32_t DEFAULT_CHANNEL_COUNT1 = 2;
// 每帧输入数据的长度,声道数 * 每帧样点数 * 每个样点的字节数(以采样格式SAMPLE_S16LE为例)
// 如果最后一帧数据不满足长度,建议进行丢弃或填充处理
constexpr int32_t INPUT_FRAME_BYTES = DEFAULT_CHANNEL_COUNT1 * SAMPLES_PER_FRAME * sizeof(short);
//程序出错点
uint32_t index = signal_->inQueue_.front();
auto buffer = signal_->inBufferQueue_.front();
OH_AVCodecBufferAttr attr = {0};
if (!inputFile_->eof()) {
inputFile_->read((char *)OH_AVBuffer_GetAddr(buffer), INPUT_FRAME_BYTES);
attr.size = INPUT_FRAME_BYTES;
attr.flags = AVCODEC_BUFFER_FLAGS_NONE;
} else {
attr.size = 0;
attr.flags = AVCODEC_BUFFER_FLAGS_EOS;
}
OH_AVBuffer_SetBufferAttr(buffer, &attr);
// 送入编码输入队列进行编码, index为对应队列下标
ret = OH_AudioCodec_PushInputBuffer(audioEnc_, index);
if (ret != AV_ERR_OK) {
// 异常处理
}
index = signal_->outQueue_.front();
OH_AVBuffer *avBuffer = signal_->outBufferQueue_.front();
// 获取buffer attributes
attr = {0};
ret = OH_AVBuffer_GetBufferAttr(avBuffer, &attr);
if (ret != AV_ERR_OK) {
// 异常处理
}
// 将编码完成数据data写入到对应输出文件中
outputFile_.write(reinterpret_cast<char*>(OH_AVBuffer_GetAddr(avBuffer)), attr.size);
// 释放已完成写入的数据
ret = OH_AudioCodec_FreeOutputBuffer(audioEnc_, index);
if (ret != AV_ERR_OK) {
// 异常处理
}
if (attr.flags == AVCODEC_BUFFER_FLAGS_EOS) {
// 结束
}
更多关于HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码PCM转换为MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
最好使用真机运行一下,或者提供一下报错日志。
更多关于HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码PCM转换为MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,调用AVcodeC进行音频编码时,模拟器崩溃可能与以下几个原因有关:
uint32_t index = signal_->inQueue_.front()这行代码可能会引发未定义行为,如果signal_->inQueue_为空,调用front()会导致崩溃。- AVcodeC的初始化或配置可能不正确,导致编码过程中出现异常。
- 内存管理问题也可能引发崩溃,例如未正确释放资源或内存泄漏。
- 最后,模拟器本身可能存在兼容性问题或bug,导致在处理特定音频编码任务时崩溃。
建议检查代码中的队列状态、AVcodeC的配置以及内存管理,确保它们符合鸿蒙系统的要求。
在HarmonyOS鸿蒙Next中,调用AVcodeC进行音频编码时,如果模拟器崩溃,可能是由于以下原因:
- 队列访问越界:
signal_->inQueue_.front()可能在队列为空时被调用,导致未定义行为。 - 内存管理问题:未正确初始化或释放资源,如音频数据缓冲区。
- 编码器配置错误:编码器参数设置不当,导致无法处理输入的PCM数据。
建议检查队列状态、资源管理及编码器配置,确保所有操作均在有效状态下进行。

