gpt4 book ai didi

c++ - 如何使用 ffmpeg 将 3840 nb_samples 编码为需要 1024 的编解码器

转载 作者:行者123 更新时间:2023-11-30 16:30:27 35 4
gpt4 key购买 nike

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);

这样它会为每个 channel 生成 3840 个样本,而不是 nb_samples(aac 编解码器)的默认值 1024 个样本。

我尝试合并 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 channel 16 位原始 pcm 48000Hz,每个 channel 有 3840 个样本,我正在尝试将其输出编码为 aac。因此,基本上,如果我让复用示例与 3840 nb_samples 一起使用,这将帮助我理解这个概念。

我已经看过How to encode resampled PCM-audio to AAC using ffmpeg-API when input pcm samples count not equal 1024但该示例使用“encodeFrame”,而 ffmpeg 文档上的示例未使用“encodeFrame”,或者我错了。

非常感谢任何帮助。

最佳答案

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

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

我从以下位置借用了缓冲代码:How to encode resampled PCM-audio to AAC using ffmpeg-API when input pcm samples count not equal 1024

关于c++ - 如何使用 ffmpeg 将 3840 nb_samples 编码为需要 1024 的编解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51144145/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com