|
@@ -68,7 +68,8 @@ GetVideoThread::GetVideoThread()
|
|
|
|
|
|
m_saveVideoFileThread = NULL;
|
|
|
|
|
|
- audio_buf_size = 0;
|
|
|
+ audio_buf_size_L = 0;
|
|
|
+ audio_buf_size_R = 0;
|
|
|
|
|
|
connect(this,SIGNAL(withChanged(int,int)),this,SLOT(slotWithChanged(int,int)),Qt::BlockingQueuedConnection);
|
|
|
connect(this,SIGNAL(loading(bool)),this,SLOT(slotLoading(bool)),Qt::BlockingQueuedConnection);
|
|
@@ -213,9 +214,8 @@ ErroCode GetVideoThread::init(QString videoDevName, bool useVideo, QString audio
|
|
|
|
|
|
out_ch_layout &= ~AV_CH_LAYOUT_STEREO;
|
|
|
|
|
|
- /// 这里音频播放使用了固定的参数
|
|
|
- /// 强制将音频重采样成44100 双声道 AV_SAMPLE_FMT_S16
|
|
|
- /// SDL播放中也是用了同样的播放参数
|
|
|
+ /// 新版ffmpeg编码aac只支持输入AV_SAMPLE_FMT_FLTP的数据
|
|
|
+ /// 强制将音频重采样成44100 双声道 AV_SAMPLE_FMT_FLTP
|
|
|
//重采样设置选项----------------
|
|
|
//输入的采样格式
|
|
|
in_sample_fmt = aCodecCtx->sample_fmt;
|
|
@@ -246,6 +246,7 @@ ErroCode GetVideoThread::init(QString videoDevName, bool useVideo, QString audio
|
|
|
in_ch_layout = AV_CH_LAYOUT_MONO;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
//qDebug()<<"1111:"<<in_sample_fmt<<in_sample_rate<<in_ch_layout<<aCodecCtx->channels<<out_sample_fmt<<out_sample_rate<<out_ch_layout<<audio_tgt_channels;
|
|
|
swrCtx = swr_alloc_set_opts(nullptr, out_ch_layout, out_sample_fmt, out_sample_rate,
|
|
|
in_ch_layout, in_sample_fmt, in_sample_rate, 0, nullptr);
|
|
@@ -350,7 +351,8 @@ void GetVideoThread::run()
|
|
|
int yuvSize = 0;
|
|
|
int size = 0;
|
|
|
|
|
|
- audio_buf_size = 0;
|
|
|
+ audio_buf_size_L = 0;
|
|
|
+ audio_buf_size_R = 0;
|
|
|
|
|
|
if (pCodecCtx)
|
|
|
{
|
|
@@ -473,28 +475,57 @@ void GetVideoThread::run()
|
|
|
}
|
|
|
|
|
|
int len2 = swr_convert(swrCtx, aFrame_ReSample->data, aFrame_ReSample->nb_samples, (const uint8_t**)aFrame->data, aFrame->nb_samples);
|
|
|
+
|
|
|
+///下面这两种方法计算的大小是一样的
|
|
|
+#if 0
|
|
|
int resampled_data_size = len2 * audio_tgt_channels * av_get_bytes_per_sample(out_sample_fmt);
|
|
|
+#else
|
|
|
+ int resampled_data_size = av_samples_get_buffer_size(NULL, audio_tgt_channels, aFrame_ReSample->nb_samples, out_sample_fmt, 1);
|
|
|
+#endif
|
|
|
|
|
|
-//qDebug()<<"audio info:"<<aCodecCtx->bit_rate<<aCodecCtx->sample_fmt<<aCodecCtx->sample_rate<<aCodecCtx->channels<<audio_tgt_channels;
|
|
|
+ int OneChannelDataSize = resampled_data_size / audio_tgt_channels;
|
|
|
|
|
|
+//qDebug()<<"audio info:"<<aCodecCtx->bit_rate<<aCodecCtx->sample_fmt<<aCodecCtx->sample_rate<<aCodecCtx->channels<<audio_tgt_channels;
|
|
|
+//static FILE *fp1 = fopen("out-L.pcm", "wb");
|
|
|
+//fwrite(aFrame_ReSample->data[0], 1, resampled_data_size / 2, fp1);
|
|
|
+//if (audio_tgt_channels >= 2)
|
|
|
+//{
|
|
|
+// static FILE *fp2 = fopen("out-R.pcm", "wb");
|
|
|
+// fwrite(aFrame_ReSample->data[1], 1, resampled_data_size / 2, fp2);
|
|
|
+//}
|
|
|
if (m_saveVideoFileThread)
|
|
|
{
|
|
|
- memcpy(audio_buf + audio_buf_size, audio_buf_resample, resampled_data_size);
|
|
|
- audio_buf_size += resampled_data_size;
|
|
|
+ memcpy(audio_buf_L + audio_buf_size_L, aFrame_ReSample->data[0], OneChannelDataSize);
|
|
|
+ audio_buf_size_L += OneChannelDataSize;
|
|
|
+
|
|
|
+ if (audio_tgt_channels >= 2)
|
|
|
+ {
|
|
|
+ memcpy(audio_buf_R + audio_buf_size_R, aFrame_ReSample->data[1], OneChannelDataSize);
|
|
|
+ audio_buf_size_R += OneChannelDataSize;
|
|
|
+ }
|
|
|
|
|
|
int index = 0;
|
|
|
int ONEAudioSize = m_saveVideoFileThread->getONEFrameSize();
|
|
|
|
|
|
- int totalSize = audio_buf_size;
|
|
|
- int leftSize = audio_buf_size;
|
|
|
+ int leftSize = audio_buf_size_L;
|
|
|
+
|
|
|
+ ONEAudioSize /= audio_tgt_channels;
|
|
|
+
|
|
|
+ /// 由于平面模式的pcm存储方式为:LLLLLLLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRRRRRRR,因此这里合并完传给编码器就行了
|
|
|
|
|
|
while(1)
|
|
|
{
|
|
|
if (leftSize >= ONEAudioSize)
|
|
|
{
|
|
|
- uint8_t * buffer = (uint8_t *)malloc(ONEAudioSize);
|
|
|
- memcpy(buffer, audio_buf+index, ONEAudioSize);
|
|
|
- m_saveVideoFileThread->audioDataQuene_Input((uint8_t*)buffer, ONEAudioSize);
|
|
|
+ uint8_t * buffer = (uint8_t *)malloc(ONEAudioSize * audio_tgt_channels);
|
|
|
+ memcpy(buffer, audio_buf_L+index, ONEAudioSize);
|
|
|
+
|
|
|
+ if (audio_tgt_channels >= 2)
|
|
|
+ {
|
|
|
+ memcpy(buffer+ONEAudioSize, audio_buf_R+index, ONEAudioSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ m_saveVideoFileThread->audioDataQuene_Input((uint8_t*)buffer, ONEAudioSize * audio_tgt_channels);
|
|
|
|
|
|
index += ONEAudioSize;
|
|
|
leftSize -= ONEAudioSize;
|
|
@@ -503,9 +534,11 @@ void GetVideoThread::run()
|
|
|
{
|
|
|
if (leftSize > 0)
|
|
|
{
|
|
|
- memcpy(audio_buf, audio_buf+index, leftSize);
|
|
|
+ memcpy(audio_buf_L, audio_buf_L+index, leftSize);
|
|
|
+ memcpy(audio_buf_R, audio_buf_R+index, leftSize);
|
|
|
}
|
|
|
- audio_buf_size = leftSize;
|
|
|
+ audio_buf_size_L = leftSize;
|
|
|
+ audio_buf_size_R = leftSize;
|
|
|
break;
|
|
|
}
|
|
|
}
|