audio_play_thread.cpp 13 KB

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