基于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
感谢您突出显示导致此行为的地方!
答案 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 );