nb_samples (22050) > frame_size (1024)
来源:1-2 课程介绍及学习指导

juvenile_time
2023-04-30
int main() {
av_log_set_level(AV_LOG_TRACE);
char errbuf[1024] = {0};
avdevice_register_all();
auto iformat = av_find_input_format("dshow");
AVFormatContext *fmt_ctx = nullptr;
auto ret = avformat_open_input(&fmt_ctx, "audio=Microphone (USB Audio Device)", iformat, nullptr);
if (ret != 0) {
av_strerror(ret, errbuf, sizeof(errbuf));
std::cout << errbuf << '\n';
return ret;
}
auto swr_ctx = swr_alloc_set_opts(nullptr,
AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_FLTP, 44100,
AV_CH_LAYOUT_STEREO, AV_SAMPLE_FMT_S16, 44100, 0, nullptr);
ret = swr_init(swr_ctx);
if (ret != 0) {
av_strerror(ret, errbuf, sizeof(errbuf));
std::cout << errbuf << '\n';
return ret;
}
uint8_t **src_data;
int linesize = 0;
int nbSamples = 88200 / 2 / 2;
uint8_t **dest_data;
int dest_linesize = 0;
av_samples_alloc_array_and_samples(&src_data, &linesize, 2, nbSamples, AV_SAMPLE_FMT_S16, 0);
av_samples_alloc_array_and_samples(&dest_data, &dest_linesize, 2, nbSamples, AV_SAMPLE_FMT_FLTP, 0);
auto encode_aac = avcodec_find_encoder(AV_CODEC_ID_AAC);
auto audio_aac_ctx = avcodec_alloc_context3(encode_aac);
audio_aac_ctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
audio_aac_ctx->channel_layout = AV_CH_LAYOUT_STEREO;
audio_aac_ctx->sample_rate = 44100;
audio_aac_ctx->bit_rate = 0;
audio_aac_ctx->profile = FF_PROFILE_AAC_HE_V2;
ret = avcodec_open2(audio_aac_ctx, encode_aac, nullptr);
if (ret != 0) {
av_strerror(ret, errbuf, sizeof(errbuf));
std::cout << errbuf << '\n';
return ret;
}
auto src_frame = av_frame_alloc();
src_frame->nb_samples = nbSamples;
src_frame->format = AV_SAMPLE_FMT_FLTP;
src_frame->channel_layout = AV_CH_LAYOUT_STEREO;
ret = av_frame_get_buffer(src_frame, 0);
if (ret != 0) {
av_strerror(ret, errbuf, sizeof(errbuf));
std::cout << errbuf << '\n';
return ret;
}
AVPacket *pkt = av_packet_alloc();
auto count = 1;
while ((ret = av_read_frame(fmt_ctx, pkt)) == 0 && count--) {
memcpy(src_data[0], pkt->data, pkt->size);
ret = swr_convert(swr_ctx, dest_data, nbSamples, (const uint8_t **) src_data, nbSamples);
memcpy(src_frame->data[0], dest_data[0], dest_linesize);
ret = avcodec_send_frame(audio_aac_ctx, src_frame);
if (ret != 0) { // AVERROR(EINVAL)
av_strerror(ret, errbuf, sizeof(errbuf));
std::cout << errbuf << '\n';
return ret;
}
av_packet_unref(pkt);
}
av_packet_unref(pkt);
swr_free(&swr_ctx);
avformat_close_input(&fmt_ctx);
}
日志 nb_samples (22050) > frame_size (1024)
写回答
1回答
-
李超
2023-05-02
原始参加的音频录制下来,可以正常播放吗?先要确保这一点。另外,采集的参数具体值是多少、把信息补充道问题里,这样才能分析问题
022023-05-02
相似问题