From bde9c947bd8e6166ad78f107ff3dd3ee3adfd444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fauconnier?= Date: Fri, 18 May 2018 15:59:20 +0200 Subject: [PATCH] fixed some issues on audio resampling --- src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp | 21 ++++++++++----------- src/podcast/ffmpeg/UBMicrophoneInput.cpp | 14 ++++++++++++++ src/podcast/podcast.pri | 4 ++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp b/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp index 9ba17e57..58f99a9c 100644 --- a/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp +++ b/src/podcast/ffmpeg/UBFFmpegVideoEncoder.cpp @@ -392,13 +392,17 @@ bool UBFFmpegVideoEncoder::init() c = mAudioStream->codec; c->bit_rate = 96000; - c->sample_fmt = audioCodec->sample_fmts[0]; // FLTP by default for AAC + c->sample_fmt = audioCodec->sample_fmts ? audioCodec->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;// FLTP by default for AAC c->sample_rate = mAudioSampleRate; - c->channels = 2; - c->channel_layout = av_get_default_channel_layout(c->channels); - c->profile = FF_PROFILE_AAC_MAIN; - c->time_base = {1, mAudioSampleRate}; - c->strict_std_compliance = -2; // Enable use of experimental codec + c->channel_layout = AV_CH_LAYOUT_STEREO; + c->channels = av_get_channel_layout_nb_channels(c->channel_layout); + + //https://trac.ffmpeg.org/wiki/Encode/H.264#Profile + //Omit this unless your target device only supports a certain profile + //(see https://trac.ffmpeg.org/wiki/Encode/H.264#Compatibility). + //c->profile = FF_PROFILE_AAC_MAIN; + + c->time_base = { 1, c->sample_rate }; if (mOutputFormatContext->oformat->flags & AVFMT_GLOBALHEADER) c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; @@ -562,11 +566,6 @@ void UBFFmpegVideoEncoder::processAudio(QByteArray &data) } // Convert to destination format - qDebug() << mSwrContext; - qDebug() << outSamples; - qDebug() << outSamplesCount; - qDebug() << inSamples; - qDebug() << inSamplesCount; ret = swr_convert(mSwrContext, outSamples, outSamplesCount, diff --git a/src/podcast/ffmpeg/UBMicrophoneInput.cpp b/src/podcast/ffmpeg/UBMicrophoneInput.cpp index ad17dd49..b86cdfd8 100644 --- a/src/podcast/ffmpeg/UBMicrophoneInput.cpp +++ b/src/podcast/ffmpeg/UBMicrophoneInput.cpp @@ -42,6 +42,18 @@ bool UBMicrophoneInput::init() } mAudioFormat = mAudioDeviceInfo.preferredFormat(); + + /* + * https://ffmpeg.org/doxygen/3.1/group__lavu__sampfmts.html#gaf9a51ca15301871723577c730b5865c5 + The data described by the sample format is always in native-endian order. + Sample values can be expressed by native C types, hence the lack of a signed 24-bit sample format + even though it is a common raw audio data format. + + If a signed 24-bit sample format is natively preferred, we a set signed 16-bit sample format instead. + */ + if (mAudioFormat.sampleSize() == 24) + mAudioFormat.setSampleSize(16); + mAudioInput = new QAudioInput(mAudioDeviceInfo, mAudioFormat, NULL); connect(mAudioInput, SIGNAL(stateChanged(QAudio::State)), @@ -294,6 +306,8 @@ QString UBMicrophoneInput::getErrorString(QAudio::Error errorCode) case QAudio::FatalError : return "Fatal error; audio device unusable"; + default: + return "unhandled error..."; } return ""; } diff --git a/src/podcast/podcast.pri b/src/podcast/podcast.pri index fd6b69d8..7e6ea9ee 100644 --- a/src/podcast/podcast.pri +++ b/src/podcast/podcast.pri @@ -31,8 +31,8 @@ macx { HEADERS += src/podcast/ffmpeg/UBFFmpegVideoEncoder.h \ src/podcast/ffmpeg/UBMicrophoneInput.h - LIBS += -lavformat -lavcodec -lswscale -lavutil \ - -lpthread -lvpx -lvorbisenc -lfreetype -llzma -lbz2 -lz -ldl -lswresample -lswscale -lavutil -lm + LIBS += -lavformat -lavcodec -lswscale -lswresample -lavutil \ + -lpthread -lvpx -lvorbisenc -lfreetype -llzma -lbz2 -lz -ldl -lavutil -lm # (ffmpeg-4.0 with all options (to clean)) # brew install ffmpeg --with-chromaprint --with-fdk-aac --with-libass --with-librsvg --with-libsoxr --with-libssh --with-tesseract