HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()
HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码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音频编码MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()的实战教程也可以访问 https://www.itying.com/category-93-b0.html
最好使用真机运行一下,或者提供一下报错日志。
更多关于HarmonyOS鸿蒙Next中为什么根据官方的AVcodeC音频编码MP3中调用按照他的顺序调用后模拟器直接崩溃了uint32_t index = signal_->inQueue_.front()的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用AVcodeC进行音频编码MP3时,模拟器崩溃可能与内存管理或线程同步问题有关。uint32_t index = signal_->inQueue_.front()这行代码尝试从inQueue_队列中获取第一个元素,如果inQueue_为空,可能导致未定义行为,如空指针访问或内存越界,从而导致模拟器崩溃。鸿蒙系统的内存管理和线程同步机制与Android有所不同,开发者需要确保在访问共享资源时进行适当的同步和空值检查。此外,鸿蒙系统的AVcodeC实现可能对输入数据的格式或状态有特定要求,不满足这些要求也可能导致崩溃。建议检查inQueue_的状态,确保其在调用front()时不为空,并验证输入数据是否符合鸿蒙系统的编码器要求。
在HarmonyOS鸿蒙Next中,调用AVcodeC音频编码MP3时,模拟器崩溃可能是由于signal_->inQueue_.front()返回的index无效或未初始化。建议检查inQueue_是否为空,确保front()调用前队列中有元素。此外,调试并验证index的值,确保其符合预期。如果问题依然存在,建议查阅官方文档或社区支持以获取更多帮助。

