繁体   English   中英

如何使用ffmpeg将3840 nb_samples编码为要求1024的编解码器

[英]How to encode 3840 nb_samples to a codec that asks for 1024 using ffmpeg

FFmpeg在https://ffmpeg.org/doxygen/4.0/muxing_8c-example.html上有一个示例混合代码

此代码生成逐帧视频和音频。 我想做的就是改变

ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
                                       c->sample_rate, nb_samples);

ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout,
                                       c->sample_rate, 3840);

因此它每个通道生成3840个样本,而不是1024个样本(nb_samples(aac编解码器)的默认设置)。

我试图结合来自https://ffmpeg.org/doxygen/4.0/transcode_aac_8c-example.html的代码,其中包含有关缓冲帧的示例。

在第一次迭代中为* q ++分配新值时,经过几帧后生成音频样本时,我的结果程序崩溃:

/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
 * 'nb_channels' channels. */
static AVFrame *get_audio_frame(OutputStream *ost)
{
    AVFrame *frame = ost->tmp_frame;
    int j, i, v;
    int16_t *q = (int16_t*)frame->data[0];
    /* check if we want to generate more frames */
    if (av_compare_ts(ost->next_pts, ost->enc->time_base,
                      STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
        return NULL;
    for (j = 0; j <frame->nb_samples; j++) {
        v = (int)(sin(ost->t) * 10000);
        for (i = 0; i < ost->enc->channels; i++)
            *q++ = v;
        ost->t     += ost->tincr;
        ost->tincr += ost->tincr2;
    }
    frame->pts = ost->next_pts;
    ost->next_pts  += frame->nb_samples;
    return frame;
}

也许我没有得到编码背后的逻辑。

这是我想出的全部资料:

https://paste.ee/p/b07qf

我尝试完成此任务的原因是,我有一个采集卡sdk,它可以输出2通道16位原始pcm 48000Hz,每个通道具有3840个样本,并且我正在尝试将其输出编码为aac。 因此,基本上,如果我得到与3840 nb_samples一起使用的混合示例,这将有助于我理解概念。

我已经研究了当输入pcm样本计数不等于1024但示例使用“ encodeFrame”时, 如何使用ffmpeg-API将重新采样的PCM音频编码为AAC,但示例使用了“ encodeFrame”,ffmpeg文档上的示例未使用该示例,或者我弄错了。

任何帮助是极大的赞赏。

好的,这是任何有兴趣的人的解决方案。

由于编解码器接受1024个样本,因此我们需要将1920个样本放入缓冲区,并一次提供1024个样本。

我从以下地方借用了缓冲代码: 当输入的pcm样本计数不等于1024时,如何使用ffmpeg-API将重新采样的PCM音频编码为AAC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM