基于FFmpeg文档随附的混合样本,我对其进行了修改,从输入格式S16转换为FLTP(平面立体声),然后输出为webm格式(立体声)。

由于输入现在是FLTP,因此我要填充两个数组,然后再次编码为FLTP。屏幕上没有出现明显的错误,但是生成的webm视频无法播放任何音频(只是视频内容)。这只是理解事物的概念证明。这是添加的(原始)函数来填充输入的FLTP立体声缓冲区:

static void get_audio_frame_for_planar_stereo(int16_t **samples, int frame_size, int nb_channels)
{
    int j, i, v[2];
    int16_t *q1 = (int16_t *) samples[0];
    int16_t *q2 = (int16_t *) samples[1];

    for (j = 0; j < frame_size; j++)
    {
        v[0] = (int)(sin(t) * 10000);
        v[1] = (int)(tan(t) * 10000);
        *q1++ = v[0];
        *q2++ = v[1];
        t     += tincr;
        tincr += tincr2;
    }
}

我是从write_audio_frame()函数内部调用的。

还要注意,无论代码以AV_SAMPLE_FMT_S16作为输入,我都已更改为AV_SAMPLE_FMT_FLTP。

整个可行的源代码在这里:

https://gist.github.com/anonymous/05d1d7662e9feafc45a6

使用ffprobe.exe运行时,请遵循以下说明:
ffprobe -show_packets output.webm >output.txt

我没有发现任何异常,所有的pts / dts值似乎都存在:

https://gist.github.com/anonymous/3ed0d6308700ab991704

有人可以强调这种误解的原因吗?

谢谢你的时间...

ps我正在使用Zeranoe FFmpeg Windows构建(32位),构建于2014年1月9日22:04:35,使用gcc 4.8.2。(GCC)

编辑:根据您在其他地方的指导,我尝试了以下操作:
    /* set options */
    //av_opt_set_int       (swr_ctx, "in_channel_count",   c->channels,       0);
    //av_opt_set_int       (swr_ctx, "in_sample_rate",     c->sample_rate,    0);
    //av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt",      AV_SAMPLE_FMT_FLTP, 0);
    //av_opt_set_int       (swr_ctx, "out_channel_count",  c->channels,       0);
    //av_opt_set_int       (swr_ctx, "out_sample_rate",    c->sample_rate,    0);
    //av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt",     c->sample_fmt,     0);

    av_opt_set_int(swr_ctx, "in_channel_layout",    AV_CH_LAYOUT_STEREO, 0);
    av_opt_set_int(swr_ctx, "in_sample_rate",       c->sample_rate, 0);
    av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);

    av_opt_set_int(swr_ctx, "out_channel_layout",    AV_CH_LAYOUT_STEREO, 0);
    av_opt_set_int(swr_ctx, "out_sample_rate",       c->sample_rate, 0);
    av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);

以及修改后的功能:
static void get_audio_frame_for_planar_stereo(uint8_t **samples, int frame_size, int nb_channels)
{
    int j, i;
    float v[2];
    float *q1 = (float *) samples[0];
    float *q2 = (float *) samples[1];

    for (j = 0; j < frame_size; j++)
    {
        v[0] = (tan(t) * 1);
        v[1] = (sin(t) * 1);
        *q1++ = v[0];
        *q2++ = v[1];
        t     += tincr;
        tincr += tincr2;
    }
}

现在,它似乎可以正常工作。我尝试将函数参数从uint8_t **更改为float **,并将src_samples_data从uint8_t **更改为float **,但在 View 上没有任何区别。

更新的代码:https://gist.github.com/anonymous/35371b2c106961029c3d

感谢您突出显示导致此行为的地方!

最佳答案

使用AV_SAMPLE_FMT_FLTP时,每个样本必须是32位浮点值(从-1.0到1.0)。您还初始化重采样器以接受浮点数:

av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);

但是用int数组填充它:
get_audio_frame_for_planar_stereo( (int16_t **)src_samples_data, src_nb_samples, c->channels );

关于c++ - FFmpeg库:修改了用于FLTP输入和FLTP音频的混合样本,丢失了音频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21232255/

10-12 19:29