audio_play_thread.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #include "audio_play_thread.h"
  2. #include "AVPlayer2/playercontroller.h"
  3. #include <utility>
  4. #include <QLoggingCategory>
  5. Q_LOGGING_CATEGORY(playerControllerAudioPlayThread, "player.controller.AudioPlayThread")
  6. #if !NDEBUG
  7. #define DEBUG_PLAYFILTER 0
  8. #define WRITE_AUDIO_FILE 0
  9. #else
  10. #define DEBUG_PLAYFILTER 0
  11. #define WRITE_AUDIO_FILE 0
  12. #endif
  13. #if WRITE_AUDIO_FILE
  14. #include <fstream>
  15. #endif
  16. AudioPlayThread::AudioPlayThread(VideoState* pState)
  17. : m_pOutput(nullptr)
  18. , m_pState(pState)
  19. {
  20. qRegisterMetaType<AudioData>("AudioData");
  21. }
  22. AudioPlayThread::~AudioPlayThread()
  23. {
  24. stop();
  25. stop_device();
  26. final_resample_param();
  27. }
  28. void AudioPlayThread::print_device() const
  29. {
  30. QAudioDeviceInfo deviceInfo = QAudioDeviceInfo::defaultOutputDevice();
  31. auto deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
  32. for (const QAudioDeviceInfo& deviceInfo : std::as_const(deviceInfos))
  33. qDebug() << "Input device name: " << deviceInfo.deviceName();
  34. deviceInfos = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput);
  35. for (const QAudioDeviceInfo& deviceInfo : std::as_const(deviceInfos))
  36. qDebug() << "Output device name: " << deviceInfo.deviceName();
  37. const auto edians = deviceInfo.supportedByteOrders();
  38. for (const QAudioFormat::Endian& endian : edians)
  39. qDebug() << "Endian: " << endian;
  40. const auto sampleTypes = deviceInfo.supportedSampleTypes();
  41. for (const QAudioFormat::SampleType& sampleType : sampleTypes)
  42. qDebug() << "sampleType: " << sampleType;
  43. const auto codecs = deviceInfo.supportedCodecs();
  44. for (const QString& codec : codecs)
  45. qDebug() << "codec: " << codec;
  46. const auto sampleRates = deviceInfo.supportedSampleRates();
  47. for (const int& sampleRate : sampleRates)
  48. qDebug() << "sampleRate: " << sampleRate;
  49. const auto ChannelCounts = deviceInfo.supportedChannelCounts();
  50. for (const int& channelCount : ChannelCounts)
  51. qDebug() << "channelCount: " << channelCount;
  52. const auto sampleSizes = deviceInfo.supportedSampleSizes();
  53. for (const int& sampleSize : sampleSizes)
  54. qDebug() << "sampleSize: " << sampleSize;
  55. }
  56. bool AudioPlayThread::init_device(int sample_rate,
  57. int channel,
  58. AVSampleFormat sample_fmt,
  59. float default_vol)
  60. {
  61. QAudioDeviceInfo deviceInfo = QAudioDeviceInfo::defaultOutputDevice();
  62. QAudioFormat format;
  63. format.setSampleRate(sample_rate);
  64. format.setChannelCount(channel);
  65. format.setSampleSize(8 * av_get_bytes_per_sample(sample_fmt));
  66. format.setCodec("audio/pcm");
  67. format.setByteOrder(QAudioFormat::LittleEndian);
  68. format.setSampleType(QAudioFormat::SignedInt);
  69. // qDebug("sample size=%d\n", 8 * av_get_bytes_per_sample(sample_fmt));
  70. if (!deviceInfo.isFormatSupported(format)) {
  71. qWarning() << "Raw audio format not supported!";
  72. return false;
  73. }
  74. // m_pOutput = std::make_unique<QAudioOutput>(deviceInfo, format);
  75. m_pOutput = new QAudioOutput(deviceInfo, format); // this 为 parent
  76. // 析构时 Qt 自动 delete
  77. set_device_volume(default_vol);
  78. m_audioDevice = m_pOutput->start();
  79. return true;
  80. }
  81. float AudioPlayThread::get_device_volume() const
  82. {
  83. if (m_pOutput)
  84. return m_pOutput->volume();
  85. return 0;
  86. }
  87. void AudioPlayThread::set_device_volume(float volume)
  88. {
  89. if (m_pOutput)
  90. m_pOutput->setVolume(volume);
  91. }
  92. void AudioPlayThread::stop_device()
  93. {
  94. if (m_pOutput) {
  95. m_pOutput->stop();
  96. m_pOutput->reset();
  97. }
  98. }
  99. void AudioPlayThread::play_file(const QString& file)
  100. {
  101. /*play pcm file directly*/
  102. QFile audioFile;
  103. audioFile.setFileName(file);
  104. audioFile.open(QIODevice::ReadOnly);
  105. m_pOutput->start(&audioFile);
  106. }
  107. void AudioPlayThread::play_buf(const uint8_t* buf, int datasize)
  108. {
  109. if (!m_audioDevice)
  110. return;
  111. uint8_t* data = (uint8_t*) buf;
  112. while (datasize > 0) {
  113. qint64 len = m_audioDevice->write((const char*) data, datasize);
  114. if (len < 0)
  115. break;
  116. if (len > 0) {
  117. data = data + len;
  118. datasize -= len;
  119. }
  120. // qDebug("play buf:reslen:%d, write len:%d", len, datasize);
  121. }
  122. }
  123. void AudioPlayThread::run()
  124. {
  125. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] run start, m_pState:" << (void*) m_pState;
  126. assert(m_pState);
  127. VideoState* is = m_pState;
  128. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] VideoState* is:" << (void*) is
  129. << ", abort_request:" << is->abort_request;
  130. int audio_size;
  131. int loop_count = 0;
  132. for (;;) {
  133. if (isExit()) {
  134. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] m_exit set, exit.";
  135. break;
  136. }
  137. if (is->abort_request) {
  138. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] abort_request set, exit.";
  139. break;
  140. }
  141. if (is->paused) {
  142. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] paused, wait.";
  143. std::unique_lock<std::mutex> lock(m_mutex);
  144. m_cv.wait_for(lock, std::chrono::milliseconds(10), [this] { return isExit(); });
  145. continue;
  146. }
  147. qCDebug(playerControllerAudioPlayThread)
  148. << "[AudioPlayThread] call audio_decode_frame, loop:" << loop_count
  149. << ", sampq size:" << (is ? is->sampq.size : -1);
  150. audio_size = audio_decode_frame(is);
  151. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] audio_decode_frame ret:" << audio_size
  152. << ", loop:" << loop_count++;
  153. if (audio_size < 0) {
  154. qCWarning(playerControllerAudioPlayThread) << "[AudioPlayThread] audio_decode_frame failed, exit.";
  155. break;
  156. }
  157. if (!isnan(is->audio_clock)) {
  158. AVCodecContext* pAudioCodex = is->auddec.avctx;
  159. if (pAudioCodex) {
  160. int bytes_per_sec = av_samples_get_buffer_size(nullptr,
  161. pAudioCodex->ch_layout.nb_channels,
  162. pAudioCodex->sample_rate,
  163. AV_SAMPLE_FMT_S16,
  164. 1);
  165. int64_t audio_callback_time = av_gettime_relative();
  166. set_clock_at(&is->audclk,
  167. is->audio_clock - (double) (audio_size) / bytes_per_sec,
  168. is->audio_clock_serial,
  169. audio_callback_time / 1000000.0);
  170. sync_clock_to_slave(&is->extclk, &is->audclk);
  171. }
  172. }
  173. }
  174. qCDebug(playerControllerAudioPlayThread) << "[AudioPlayThread] run end, abort_request:" << is->abort_request
  175. << ", m_exit:" << (m_exit ? m_exit->load() : -1);
  176. }
  177. int AudioPlayThread::audio_decode_frame(VideoState* is)
  178. {
  179. int data_size;
  180. Frame* af;
  181. do {
  182. while (frame_queue_nb_remaining(&is->sampq) == 0) {
  183. if (is->eof) {
  184. // break;
  185. return -1;
  186. } else {
  187. av_usleep(1000);
  188. // return -1;
  189. }
  190. if (is->abort_request || isExit())
  191. break;
  192. }
  193. if (is->abort_request || isExit())
  194. return -1;
  195. if (!(af = frame_queue_peek_readable(&is->sampq)))
  196. return -1;
  197. frame_queue_next(&is->sampq);
  198. } while (af->serial != is->audioq.serial);
  199. /*data_size = av_samples_get_buffer_size(nullptr, af->frame->channels,
  200. af->frame->nb_samples,
  201. AVSampleFormat(af->frame->format), 1);*/
  202. #if USE_AVFILTER_AUDIO
  203. data_size = av_samples_get_buffer_size(nullptr,
  204. af->frame->ch_layout.nb_channels,
  205. af->frame->nb_samples,
  206. AV_SAMPLE_FMT_S16,
  207. 1);
  208. uint8_t* const buffer_audio = (uint8_t*) av_malloc(data_size * sizeof(uint8_t));
  209. memcpy(buffer_audio, af->frame->data[0], data_size);
  210. #else
  211. struct SwrContext* swrCtx = m_audioResample.swrCtx;
  212. data_size = av_samples_get_buffer_size(nullptr,
  213. af->frame->channels,
  214. af->frame->nb_samples,
  215. AV_SAMPLE_FMT_S16,
  216. 0); // AVSampleFormat(af->frame->format)
  217. uint8_t* buffer_audio = (uint8_t*) av_malloc(data_size * sizeof(uint8_t));
  218. int ret = swr_convert(swrCtx,
  219. &buffer_audio,
  220. af->frame->nb_samples,
  221. (const uint8_t**) (af->frame->data),
  222. af->frame->nb_samples);
  223. if (ret < 0) {
  224. return 0;
  225. }
  226. #endif
  227. if (is->muted && data_size > 0)
  228. memset(buffer_audio, 0, data_size); // mute
  229. #if WRITE_AUDIO_FILE
  230. std::ofstream myfile;
  231. myfile.open("audio.pcm", std::ios::out | std::ios::app | std::ios::binary);
  232. if (myfile.is_open()) {
  233. myfile.write((char*) buffer_audio, data_size);
  234. }
  235. #endif
  236. if (m_bSendToVisual) {
  237. AudioData data;
  238. if (data_size > BUFFER_LEN) {
  239. qDebug() << "audio frame is too long,data_size:" << data_size
  240. << ", buffer_len:" << BUFFER_LEN << "\n";
  241. }
  242. int len = std::min(data_size, BUFFER_LEN);
  243. memcpy(data.buffer, buffer_audio, len);
  244. data.len = len;
  245. if (m_onDataVisualReady)
  246. m_onDataVisualReady(data);
  247. }
  248. play_buf(buffer_audio, data_size);
  249. av_free((void*) buffer_audio);
  250. /* update the audio clock with the pts */
  251. if (!isnan(af->pts)) {
  252. // is->audio_clock = af->pts + (double)af->frame->nb_samples /
  253. // af->frame->sample_rate;
  254. double frame = (double) af->frame->nb_samples / af->frame->sample_rate;
  255. // frame = frame * is->audio_speed;
  256. is->audio_clock = af->pts + frame;
  257. #if USE_AVFILTER_AUDIO
  258. is->audio_clock = is->audio_clock_old
  259. + (is->audio_clock - is->audio_clock_old) * is->audio_speed;
  260. // is->audio_clock = is->audio_clock * is->audio_speed;
  261. #endif
  262. #if DEBUG_PLAYFILTER
  263. static int pks_num = 0;
  264. pks_num++;
  265. qDebug("[%d]audio: clock=%0.3f pts=%0.3f, (nb:%d, sr:%d)frame:%0.3f\n",
  266. pks_num,
  267. is->audio_clock,
  268. af->pts,
  269. af->frame->nb_samples,
  270. af->frame->sample_rate,
  271. frame);
  272. // qDebug("audio: clock=%0.3f pts=%0.3f, (nb:%d, sr:%d)frame:%0.3f\n",
  273. // is->audio_clock, af->pts, af->frame->nb_samples, af->frame->sample_rate,
  274. // frame);
  275. #endif
  276. } else {
  277. is->audio_clock = NAN;
  278. }
  279. is->audio_clock_serial = af->serial;
  280. if (m_onUpdatePlayTime)
  281. m_onUpdatePlayTime();
  282. #if (!NDEBUG && PRINT_PACKETQUEUE_AUDIO_INFO)
  283. {
  284. static double last_clock;
  285. qDebug("audio: delay=%0.3f clock=%0.3f\n", is->audio_clock - last_clock, is->audio_clock);
  286. last_clock = is->audio_clock;
  287. }
  288. #endif
  289. return data_size;
  290. }
  291. bool AudioPlayThread::init_resample_param(AVCodecContext* pAudio,
  292. AVSampleFormat sample_fmt,
  293. VideoState* is)
  294. {
  295. if (pAudio) {
  296. int ret = -1;
  297. struct SwrContext* swrCtx = nullptr;
  298. #if USE_AVFILTER_AUDIO
  299. if (is) {
  300. AVFilterContext* sink = is->out_audio_filter;
  301. // int sample_rate = av_buffersink_get_sample_rate(sink);
  302. // int nb_channels = av_buffersink_get_channels(sink);
  303. AVChannelLayout channel_layout;
  304. av_buffersink_get_ch_layout(sink, &channel_layout);
  305. // int64_t channel_layout = av_buffersink_get_channel_layout(sink);
  306. int format = av_buffersink_get_format(sink);
  307. ret = swr_alloc_set_opts2(&swrCtx,
  308. &pAudio->ch_layout,
  309. sample_fmt,
  310. pAudio->sample_rate,
  311. &channel_layout,
  312. (AVSampleFormat) format,
  313. pAudio->sample_rate,
  314. 0,
  315. nullptr);
  316. /*m_audioResample.channel_layout = channel_layout;
  317. m_audioResample.sample_fmt = sample_fmt;
  318. m_audioResample.sample_rate = pAudio->sample_rate;*/
  319. }
  320. #else
  321. ret = swr_alloc_set_opts2(&swrCtx,
  322. &pAudio->ch_layout,
  323. sample_fmt,
  324. pAudio->sample_rate,
  325. &pAudio->ch_layout,
  326. pAudio->sample_fmt,
  327. pAudio->sample_rate,
  328. 0,
  329. nullptr);
  330. #endif
  331. if (!(ret < 0)) {
  332. swr_init(swrCtx);
  333. m_audioResample.swrCtx = swrCtx;
  334. return true;
  335. }
  336. }
  337. return false;
  338. }
  339. void AudioPlayThread::final_resample_param()
  340. {
  341. swr_free(&m_audioResample.swrCtx);
  342. }