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