FFmpeg库:用于FLTP输入和FLTP音频的修改的muxing样本,丢失音频

时间:2014-01-20 11:02:20

标签: c++ audio ffmpeg webm

基于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

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

感谢您的时间......

P.S。我正在使用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 **,但在视图中没有任何区别。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

但是用一系列的整数提供它:

get_audio_frame_for_planar_stereo( (int16_t **)src_samples_data, src_nb_samples, c->channels );