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

原始参加的音频录制下来,可以正常播放吗?先要确保这一点。另外,采集的参数具体值是多少、把信息补充道问题里,这样才能分析问题

0
2
juvenile_time
采集的参数具体值是什么 pkt size吗
2023-05-02
共2条回复

音视频小白系统入门课 音视频基础+ffmpeg原理

掌握音视频采集、编解码、RTMP传输协议等核心基础

2317 学习 · 813 问题

查看课程