audio_play_thread.cpp 14 KB

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