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
上有一个示例混合代码
此代码生成逐帧视频和音频。我正在尝试做的是更改
1 2 | ost->tmp_frame = alloc_audio_frame(AV_SAMPLE_FMT_S16, c->channel_layout, c->sample_rate, nb_samples); |
到
1 2 | 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分配新值时,在几帧之后生成音频样本时,我的结果程序崩溃:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* 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,ffmpeg文档上的示例未使用还是我弄错了。
非常感谢您的帮助。
好吧,这是有兴趣的人的解决方案。
由于编解码器接受1024个样本,因此我们需要将1920个样本放入缓冲区中,并一次将1024个样本送入编解码器。
我从以下位置借用了缓冲代码:当输入的pcm样本计数不等于1024时,如何使用ffmpeg-API将重新采样的PCM音频编码为AAC