muxer_ffmpeg.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. #include "muxer_ffmpeg.h"
  2. #include "muxer_define.h"
  3. #include "record_desktop.h"
  4. #include "encoder_video.h"
  5. #include "encoder_video_factory.h"
  6. #include "sws_helper.h"
  7. #include "record_audio.h"
  8. #include "encoder_aac.h"
  9. #include "filter_amix.h"
  10. #include "filter_aresample.h"
  11. #include "ring_buffer.h"
  12. #include "log_helper.h"
  13. #include "error_define.h"
  14. namespace am {
  15. muxer_ffmpeg::muxer_ffmpeg()
  16. {
  17. av_register_all();
  18. _v_stream = NULL;
  19. _a_stream = NULL;
  20. _fmt = NULL;
  21. _fmt_ctx = NULL;
  22. _base_time = -1;
  23. }
  24. muxer_ffmpeg::~muxer_ffmpeg()
  25. {
  26. stop();
  27. cleanup();
  28. }
  29. int muxer_ffmpeg::init(
  30. const char * output_file,
  31. record_desktop * source_desktop,
  32. record_audio ** source_audios,
  33. const int source_audios_nb,
  34. const MUX_SETTING_T & setting
  35. )
  36. {
  37. int error = AE_NO;
  38. int ret = 0;
  39. do {
  40. al_info("start to initialize muxer ,output:%s ", output_file);
  41. error = alloc_oc(output_file, setting);
  42. if (error != AE_NO)
  43. break;
  44. if (_fmt->video_codec != AV_CODEC_ID_NONE) {
  45. error = add_video_stream(setting, source_desktop);
  46. if (error != AE_NO)
  47. break;
  48. }
  49. if (_fmt->audio_codec != AV_CODEC_ID_NONE && source_audios_nb) {
  50. error = add_audio_stream(setting, source_audios, source_audios_nb);
  51. if (error != AE_NO)
  52. break;
  53. }
  54. error = open_output(output_file, setting);
  55. if (error != AE_NO)
  56. break;
  57. av_dump_format(_fmt_ctx, 0, NULL, 1);
  58. _inited = true;
  59. } while (0);
  60. if (error != AE_NO) {
  61. cleanup();
  62. al_debug("muxer ffmpeg initialize failed:%s %d", err2str(error), ret);
  63. }
  64. return error;
  65. }
  66. int muxer_ffmpeg::start()
  67. {
  68. std::lock_guard<std::mutex> lock(_mutex);
  69. int error = AE_NO;
  70. if (_running == true) {
  71. return AE_NO;
  72. }
  73. if (_inited == false) {
  74. return AE_NEED_INIT;
  75. }
  76. _base_time = av_gettime_relative();
  77. if (_v_stream && _v_stream->v_enc)
  78. _v_stream->v_enc->start();
  79. if (_a_stream && _a_stream->a_enc)
  80. _a_stream->a_enc->start();
  81. if (_a_stream && _a_stream->a_nb >= 2 && _a_stream->a_filter_amix)
  82. _a_stream->a_filter_amix->start();
  83. if (_a_stream && _a_stream->a_nb < 2 && _a_stream->a_filter_aresample) {
  84. for (int i = 0; i < _a_stream->a_nb; i++) {
  85. _a_stream->a_filter_aresample[i]->start();
  86. }
  87. }
  88. if (_a_stream && _a_stream->a_src) {
  89. for (int i = 0; i < _a_stream->a_nb; i++) {
  90. if(_a_stream->a_src[i])
  91. _a_stream->a_src[i]->start();
  92. }
  93. }
  94. if (_v_stream && _v_stream->v_src)
  95. _v_stream->v_src->start();
  96. _running = true;
  97. return error;
  98. }
  99. int muxer_ffmpeg::stop()
  100. {
  101. std::lock_guard<std::mutex> lock(_mutex);
  102. if (_running == false)
  103. return AE_NO;
  104. _running = false;
  105. al_debug("try to stop muxer....");
  106. al_debug("stop audio recorder...");
  107. if (_a_stream && _a_stream->a_src) {
  108. for (int i = 0; i < _a_stream->a_nb; i++) {
  109. _a_stream->a_src[i]->stop();
  110. }
  111. }
  112. al_debug("stop video recorder...");
  113. if (_v_stream && _v_stream->v_src)
  114. _v_stream->v_src->stop();
  115. al_debug("stop audio amix filter...");
  116. if (_a_stream && _a_stream->a_filter_amix)
  117. _a_stream->a_filter_amix->stop();
  118. al_debug("stop audio aresampler filter...");
  119. if (_a_stream && _a_stream->a_filter_aresample) {
  120. for (int i = 0; i < _a_stream->a_nb; i++) {
  121. _a_stream->a_filter_aresample[i]->stop();
  122. }
  123. }
  124. al_debug("stop video encoder...");
  125. if (_v_stream && _v_stream->v_enc)
  126. _v_stream->v_enc->stop();
  127. al_debug("stop audio encoder...");
  128. if (_a_stream) {
  129. if (_a_stream->a_enc)
  130. _a_stream->a_enc->stop();
  131. }
  132. al_debug("write file trailer...");
  133. if (_fmt_ctx)
  134. av_write_trailer(_fmt_ctx);//must write trailer ,otherwise file can not play
  135. al_debug("muxer stopped...");
  136. return AE_NO;
  137. }
  138. int muxer_ffmpeg::pause()
  139. {
  140. _paused = true;
  141. return 0;
  142. }
  143. int muxer_ffmpeg::resume()
  144. {
  145. _paused = false;
  146. return 0;
  147. }
  148. void muxer_ffmpeg::on_desktop_data(AVFrame *frame)
  149. {
  150. if (_running == false || _paused == true || !_v_stream || !_v_stream->v_enc || !_v_stream->v_sws) {
  151. return;
  152. }
  153. int len = 0, ret = AE_NO;
  154. uint8_t *yuv_data = NULL;
  155. ret = _v_stream->v_sws->convert(frame, &yuv_data, &len);
  156. if (ret == AE_NO && yuv_data && len) {
  157. _v_stream->v_enc->put(yuv_data, len, frame);
  158. if (_on_yuv_data && _preview_enabled == true)
  159. _on_yuv_data(yuv_data, len, frame->width, frame->height, 0);
  160. }
  161. }
  162. void muxer_ffmpeg::on_desktop_error(int error)
  163. {
  164. al_fatal("on desktop capture error:%d", error);
  165. }
  166. int getPcmDB(const unsigned char *pcmdata, size_t size) {
  167. int db = 0;
  168. float value = 0;
  169. double sum = 0;
  170. double average = 0;
  171. int bit_per_sample = 32;
  172. int byte_per_sample = bit_per_sample / 8;
  173. int channel_num = 2;
  174. for (int i = 0; i < size; i += channel_num * byte_per_sample)
  175. {
  176. memcpy(&value, pcmdata + i, byte_per_sample);
  177. sum += abs(value);
  178. }
  179. average = sum / (double)(size / byte_per_sample /channel_num);
  180. if (average > 0)
  181. {
  182. db = (int)(20 * log10f(average));
  183. }
  184. al_debug("%d %f %f", db, average,sum);
  185. return db;
  186. }
  187. static int pcm_fltp_db_count(AVFrame *frame, int channels)
  188. {
  189. int i = 0, ch = 0;
  190. int ndb = 0;
  191. float value = 0.;
  192. float *ch_left = (float *)frame->data[0];
  193. //float *ch_right = (float *)frame->data[1];
  194. for (i = 0; i < frame->nb_samples; i++)
  195. {
  196. value += fabs(ch_left[i]);
  197. }
  198. value = value / frame->nb_samples;
  199. if (0 != value)
  200. {
  201. ndb = (int)(20.0*log10((value / 1.0)));
  202. }
  203. else
  204. ndb = -100;
  205. return ndb;
  206. }
  207. void muxer_ffmpeg::on_audio_data(AVFrame *frame, int index)
  208. {
  209. if (_running == false || _paused == true)
  210. return;
  211. if (_a_stream->a_filter_amix != nullptr)
  212. _a_stream->a_filter_amix->add_frame(frame, index);
  213. else if (_a_stream->a_filter_aresample != nullptr && _a_stream->a_filter_aresample[index] != nullptr) {
  214. _a_stream->a_filter_aresample[index]->add_frame(frame);
  215. }
  216. return;
  217. }
  218. void muxer_ffmpeg::on_audio_error(int error, int index)
  219. {
  220. al_fatal("on audio capture error:%d with stream index:%d", error, index);
  221. }
  222. void muxer_ffmpeg::on_filter_amix_data(AVFrame * frame, int)
  223. {
  224. if (_running == false || !_a_stream->a_enc)
  225. return;
  226. AUDIO_SAMPLE *resamples = _a_stream->a_resamples[0];
  227. int copied_len = 0;
  228. int sample_len = av_samples_get_buffer_size(frame->linesize, frame->channels, frame->nb_samples, (AVSampleFormat)frame->format, 1);
  229. sample_len = av_samples_get_buffer_size(NULL, frame->channels, frame->nb_samples, (AVSampleFormat)frame->format, 1);
  230. #ifdef _DEBUG
  231. //al_debug("dg:%d", pcm_fltp_db_count(frame, frame->channels));
  232. #endif
  233. int remain_len = sample_len;
  234. //for data is planar,should copy data[0] data[1] to correct buff pos
  235. if (av_sample_fmt_is_planar((AVSampleFormat)frame->format) == 0) {
  236. while (remain_len > 0) {
  237. //cache pcm
  238. copied_len = min(resamples->size - resamples->sample_in, remain_len);
  239. if (copied_len) {
  240. memcpy(resamples->buff + resamples->sample_in, frame->data[0] + sample_len - remain_len, copied_len);
  241. resamples->sample_in += copied_len;
  242. remain_len = remain_len - copied_len;
  243. }
  244. //got enough pcm to encoder,resample and mix
  245. if (resamples->sample_in == resamples->size) {
  246. _a_stream->a_enc->put(resamples->buff, resamples->size, frame);
  247. resamples->sample_in = 0;
  248. }
  249. }
  250. }
  251. else {//resample size is channels*frame->linesize[0],for 2 channels
  252. while (remain_len > 0) {
  253. copied_len = min(resamples->size - resamples->sample_in, remain_len);
  254. if (copied_len) {
  255. memcpy(resamples->buff + resamples->sample_in / 2, frame->data[0] + (sample_len - remain_len) / 2, copied_len / 2);
  256. memcpy(resamples->buff + resamples->size / 2 + resamples->sample_in / 2, frame->data[1] + (sample_len - remain_len) / 2, copied_len / 2);
  257. resamples->sample_in += copied_len;
  258. remain_len = remain_len - copied_len;
  259. }
  260. if (resamples->sample_in == resamples->size) {
  261. _a_stream->a_enc->put(resamples->buff, resamples->size, frame);
  262. resamples->sample_in = 0;
  263. }
  264. }
  265. }
  266. }
  267. void muxer_ffmpeg::on_filter_amix_error(int error, int)
  268. {
  269. al_fatal("on filter amix audio error:%d", error);
  270. }
  271. void muxer_ffmpeg::on_filter_aresample_data(AVFrame * frame, int index)
  272. {
  273. if (_running == false || !_a_stream->a_enc)
  274. return;
  275. AUDIO_SAMPLE *resamples = _a_stream->a_resamples[0];
  276. int copied_len = 0;
  277. int sample_len = av_samples_get_buffer_size(frame->linesize, frame->channels, frame->nb_samples, (AVSampleFormat)frame->format, 1);
  278. sample_len = av_samples_get_buffer_size(NULL, frame->channels, frame->nb_samples, (AVSampleFormat)frame->format, 1);
  279. int remain_len = sample_len;
  280. //for data is planar,should copy data[0] data[1] to correct buff pos
  281. if (av_sample_fmt_is_planar((AVSampleFormat)frame->format) == 0) {
  282. while (remain_len > 0) {
  283. //cache pcm
  284. copied_len = min(resamples->size - resamples->sample_in, remain_len);
  285. if (copied_len) {
  286. memcpy(resamples->buff + resamples->sample_in, frame->data[0] + sample_len - remain_len, copied_len);
  287. resamples->sample_in += copied_len;
  288. remain_len = remain_len - copied_len;
  289. }
  290. //got enough pcm to encoder,resample and mix
  291. if (resamples->sample_in == resamples->size) {
  292. _a_stream->a_enc->put(resamples->buff, resamples->size, frame);
  293. resamples->sample_in = 0;
  294. }
  295. }
  296. }
  297. else {//resample size is channels*frame->linesize[0],for 2 channels
  298. while (remain_len > 0) {
  299. copied_len = min(resamples->size - resamples->sample_in, remain_len);
  300. if (copied_len) {
  301. memcpy(resamples->buff + resamples->sample_in / 2, frame->data[0] + (sample_len - remain_len) / 2, copied_len / 2);
  302. memcpy(resamples->buff + resamples->size / 2 + resamples->sample_in / 2, frame->data[1] + (sample_len - remain_len) / 2, copied_len / 2);
  303. resamples->sample_in += copied_len;
  304. remain_len = remain_len - copied_len;
  305. }
  306. if (resamples->sample_in == resamples->size) {
  307. _a_stream->a_enc->put(resamples->buff, resamples->size, frame);
  308. resamples->sample_in = 0;
  309. }
  310. }
  311. }
  312. }
  313. void muxer_ffmpeg::on_filter_aresample_error(int error, int index)
  314. {
  315. al_fatal("on filter aresample[%d] audio error:%d", index, error);
  316. }
  317. void muxer_ffmpeg::on_enc_264_data(AVPacket *packet)
  318. {
  319. if (_running && _v_stream) {
  320. write_video(packet);
  321. }
  322. }
  323. void muxer_ffmpeg::on_enc_264_error(int error)
  324. {
  325. al_fatal("on desktop encode error:%d", error);
  326. }
  327. void muxer_ffmpeg::on_enc_aac_data(AVPacket *packet)
  328. {
  329. if (_running && _a_stream) {
  330. write_audio(packet);
  331. }
  332. }
  333. void muxer_ffmpeg::on_enc_aac_error(int error)
  334. {
  335. al_fatal("on audio encode error:%d", error);
  336. }
  337. int muxer_ffmpeg::alloc_oc(const char * output_file, const MUX_SETTING_T & setting)
  338. {
  339. _output_file = std::string(output_file);
  340. int error = AE_NO;
  341. int ret = 0;
  342. do {
  343. ret = avformat_alloc_output_context2(&_fmt_ctx, NULL, NULL, output_file);
  344. if (ret < 0 || !_fmt_ctx) {
  345. error = AE_FFMPEG_ALLOC_CONTEXT_FAILED;
  346. break;
  347. }
  348. _fmt = _fmt_ctx->oformat;
  349. } while (0);
  350. return error;
  351. }
  352. int muxer_ffmpeg::add_video_stream(const MUX_SETTING_T & setting, record_desktop * source_desktop)
  353. {
  354. int error = AE_NO;
  355. int ret = 0;
  356. _v_stream = new MUX_STREAM();
  357. memset(_v_stream, 0, sizeof(MUX_STREAM));
  358. _v_stream->v_src = source_desktop;
  359. _v_stream->pre_pts = -1;
  360. _v_stream->v_src->registe_cb(
  361. std::bind(&muxer_ffmpeg::on_desktop_data, this, std::placeholders::_1),
  362. std::bind(&muxer_ffmpeg::on_desktop_error, this, std::placeholders::_1)
  363. );
  364. RECORD_DESKTOP_RECT v_rect = _v_stream->v_src->get_rect();
  365. do {
  366. error = encoder_video_new(setting.v_encoder_id, &_v_stream->v_enc);
  367. if (error != AE_NO)
  368. break;
  369. error = _v_stream->v_enc->init(setting.v_out_width,
  370. setting.v_out_height,
  371. setting.v_frame_rate,
  372. setting.v_bit_rate,
  373. setting.v_qb
  374. );
  375. if (error != AE_NO)
  376. break;
  377. _v_stream->v_enc->registe_cb(
  378. std::bind(&muxer_ffmpeg::on_enc_264_data, this, std::placeholders::_1),
  379. std::bind(&muxer_ffmpeg::on_enc_264_error, this, std::placeholders::_1)
  380. );
  381. _v_stream->v_sws = new sws_helper();
  382. error = _v_stream->v_sws->init(
  383. _v_stream->v_src->get_pixel_fmt(),
  384. v_rect.right - v_rect.left,
  385. v_rect.bottom - v_rect.top,
  386. AV_PIX_FMT_YUV420P,
  387. setting.v_out_width,
  388. setting.v_out_height
  389. );
  390. if (error != AE_NO)
  391. break;
  392. AVCodec *codec = avcodec_find_encoder(_v_stream->v_enc->get_codec_id());
  393. if (!codec) {
  394. error = AE_FFMPEG_FIND_ENCODER_FAILED;
  395. break;
  396. }
  397. _fmt->video_codec = codec->id;
  398. AVStream *st = avformat_new_stream(_fmt_ctx, codec);
  399. if (!st) {
  400. error = AE_FFMPEG_NEW_STREAM_FAILED;
  401. break;
  402. }
  403. st->codec->codec_id = AV_CODEC_ID_H264;
  404. st->codec->bit_rate_tolerance = setting.v_bit_rate;
  405. st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
  406. st->codec->time_base.den = setting.v_frame_rate;
  407. st->codec->time_base.num = 1;
  408. st->codec->pix_fmt = AV_PIX_FMT_YUV420P;
  409. st->codec->coded_width = setting.v_out_width;
  410. st->codec->coded_height = setting.v_out_height;
  411. st->codec->width = setting.v_out_width;
  412. st->codec->height = setting.v_out_height;
  413. st->codec->max_b_frames = 0;//NO B Frame
  414. st->time_base = { 1,90000 };//fixed?
  415. st->avg_frame_rate = av_inv_q(st->codec->time_base);
  416. if (_fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) {//without this,normal player can not play,extradata will write with avformat_write_header
  417. st->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
  418. st->codec->extradata_size = _v_stream->v_enc->get_extradata_size();// +AV_INPUT_BUFFER_PADDING_SIZE;
  419. st->codec->extradata = (uint8_t*)av_memdup(_v_stream->v_enc->get_extradata(), _v_stream->v_enc->get_extradata_size());
  420. }
  421. _v_stream->st = st;
  422. _v_stream->setting = setting;
  423. //_v_stream->filter = av_bitstream_filter_init("h264_mp4toannexb");
  424. } while (0);
  425. return error;
  426. }
  427. int muxer_ffmpeg::add_audio_stream(const MUX_SETTING_T & setting, record_audio ** source_audios, const int source_audios_nb)
  428. {
  429. int error = AE_NO;
  430. int ret = 0;
  431. _a_stream = new MUX_STREAM();
  432. memset(_a_stream, 0, sizeof(MUX_STREAM));
  433. _a_stream->a_nb = source_audios_nb;
  434. _a_stream->a_filter_aresample = new filter_aresample*[_a_stream->a_nb];
  435. _a_stream->a_resamples = new AUDIO_SAMPLE*[_a_stream->a_nb];
  436. _a_stream->a_samples = new AUDIO_SAMPLE*[_a_stream->a_nb];
  437. _a_stream->a_src = new record_audio*[_a_stream->a_nb];
  438. _a_stream->pre_pts = -1;
  439. do {
  440. _a_stream->a_enc = new encoder_aac();
  441. error = _a_stream->a_enc->init(
  442. setting.a_nb_channel,
  443. setting.a_sample_rate,
  444. setting.a_sample_fmt,
  445. setting.a_bit_rate
  446. );
  447. if (error != AE_NO)
  448. break;
  449. _a_stream->a_enc->registe_cb(
  450. std::bind(&muxer_ffmpeg::on_enc_aac_data, this, std::placeholders::_1),
  451. std::bind(&muxer_ffmpeg::on_enc_aac_error, this, std::placeholders::_1)
  452. );
  453. for (int i = 0; i < _a_stream->a_nb; i++) {
  454. _a_stream->a_src[i] = source_audios[i];
  455. _a_stream->a_src[i]->registe_cb(
  456. std::bind(&muxer_ffmpeg::on_audio_data, this, std::placeholders::_1, std::placeholders::_2),
  457. std::bind(&muxer_ffmpeg::on_audio_error, this, std::placeholders::_1, std::placeholders::_2),
  458. i
  459. );
  460. _a_stream->a_filter_aresample[i] = new filter_aresample();
  461. _a_stream->a_resamples[i] = new AUDIO_SAMPLE({ NULL,0,0 });
  462. FILTER_CTX ctx_in = { 0 }, ctx_out = { 0 };
  463. ctx_in.time_base = _a_stream->a_src[i]->get_time_base();
  464. ctx_in.channel_layout = av_get_default_channel_layout(_a_stream->a_src[i]->get_channel_num());
  465. ctx_in.nb_channel = _a_stream->a_src[i]->get_channel_num();
  466. ctx_in.sample_fmt = _a_stream->a_src[i]->get_fmt();
  467. ctx_in.sample_rate = _a_stream->a_src[i]->get_sample_rate();
  468. ctx_out.time_base = { 1,AV_TIME_BASE };
  469. ctx_out.channel_layout = av_get_default_channel_layout(setting.a_nb_channel);
  470. ctx_out.nb_channel = setting.a_nb_channel;
  471. ctx_out.sample_fmt = setting.a_sample_fmt;
  472. ctx_out.sample_rate = setting.a_sample_rate;
  473. _a_stream->a_filter_aresample[i]->init(ctx_in, ctx_out, i);
  474. _a_stream->a_filter_aresample[i]->registe_cb(
  475. std::bind(&muxer_ffmpeg::on_filter_aresample_data, this, std::placeholders::_1, std::placeholders::_2),
  476. std::bind(&muxer_ffmpeg::on_filter_aresample_error, this, std::placeholders::_1, std::placeholders::_2));
  477. _a_stream->a_resamples[i]->size = av_samples_get_buffer_size(
  478. NULL, setting.a_nb_channel, _a_stream->a_enc->get_nb_samples(), setting.a_sample_fmt, 1);
  479. _a_stream->a_resamples[i]->buff = new uint8_t[_a_stream->a_resamples[i]->size];
  480. _a_stream->a_samples[i] = new AUDIO_SAMPLE({ NULL,0,0 });
  481. _a_stream->a_samples[i]->size = av_samples_get_buffer_size(
  482. NULL, _a_stream->a_src[i]->get_channel_num(), _a_stream->a_enc->get_nb_samples(), _a_stream->a_src[i]->get_fmt(), 1);
  483. _a_stream->a_samples[i]->buff = new uint8_t[_a_stream->a_samples[i]->size];
  484. }
  485. if (_a_stream->a_nb >= 2) {
  486. _a_stream->a_filter_amix = new am::filter_amix();
  487. error = _a_stream->a_filter_amix->init(
  488. {
  489. NULL,NULL,
  490. _a_stream->a_src[0]->get_time_base(),
  491. _a_stream->a_src[0]->get_sample_rate(),
  492. _a_stream->a_src[0]->get_fmt(),
  493. _a_stream->a_src[0]->get_channel_num(),
  494. av_get_default_channel_layout(_a_stream->a_src[0]->get_channel_num())
  495. },
  496. {
  497. NULL,NULL,
  498. _a_stream->a_src[1]->get_time_base(),
  499. _a_stream->a_src[1]->get_sample_rate(),
  500. _a_stream->a_src[1]->get_fmt(),
  501. _a_stream->a_src[1]->get_channel_num(),
  502. av_get_default_channel_layout(_a_stream->a_src[1]->get_channel_num())
  503. },
  504. {
  505. NULL,NULL,
  506. { 1,AV_TIME_BASE },
  507. setting.a_sample_rate,
  508. setting.a_sample_fmt,
  509. setting.a_nb_channel,
  510. av_get_default_channel_layout(setting.a_nb_channel)
  511. }
  512. );
  513. if (error != AE_NO) {
  514. break;
  515. }
  516. _a_stream->a_filter_amix->registe_cb(
  517. std::bind(&muxer_ffmpeg::on_filter_amix_data, this, std::placeholders::_1, std::placeholders::_2),
  518. std::bind(&muxer_ffmpeg::on_filter_amix_error, this, std::placeholders::_1, std::placeholders::_2)
  519. );
  520. }
  521. AVCodec *codec = avcodec_find_encoder(_a_stream->a_enc->get_codec_id());
  522. if (!codec) {
  523. error = AE_FFMPEG_FIND_ENCODER_FAILED;
  524. break;
  525. }
  526. _fmt->audio_codec = _a_stream->a_enc->get_codec_id();
  527. AVStream *st = avformat_new_stream(_fmt_ctx, codec);
  528. if (!st) {
  529. error = AE_FFMPEG_NEW_STREAM_FAILED;
  530. break;
  531. }
  532. av_dict_set(&st->metadata, "title", "Track1", 0);
  533. st->time_base = { 1,setting.a_sample_rate };
  534. st->codec->bit_rate = setting.a_bit_rate;
  535. st->codec->channels = setting.a_nb_channel;
  536. st->codec->sample_rate = setting.a_sample_rate;
  537. st->codec->sample_fmt = setting.a_sample_fmt;
  538. st->codec->time_base = { 1,setting.a_sample_rate };
  539. st->codec->channel_layout = av_get_default_channel_layout(setting.a_nb_channel);
  540. if (_fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) {//without this,normal player can not play
  541. st->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
  542. st->codec->extradata_size = _a_stream->a_enc->get_extradata_size();// +AV_INPUT_BUFFER_PADDING_SIZE;
  543. st->codec->extradata = (uint8_t*)av_memdup(_a_stream->a_enc->get_extradata(), _a_stream->a_enc->get_extradata_size());
  544. }
  545. _a_stream->st = st;
  546. _a_stream->setting = setting;
  547. _a_stream->filter = av_bitstream_filter_init("aac_adtstoasc");
  548. } while (0);
  549. return error;
  550. }
  551. int muxer_ffmpeg::open_output(const char * output_file, const MUX_SETTING_T & setting)
  552. {
  553. int error = AE_NO;
  554. int ret = 0;
  555. do {
  556. if (!(_fmt->flags & AVFMT_NOFILE)) {
  557. ret = avio_open(&_fmt_ctx->pb, output_file, AVIO_FLAG_WRITE);
  558. if (ret < 0) {
  559. error = AE_FFMPEG_OPEN_IO_FAILED;
  560. break;
  561. }
  562. }
  563. AVDictionary* opt = NULL;
  564. av_dict_set_int(&opt, "video_track_timescale", _v_stream->setting.v_frame_rate, 0);
  565. //ret = avformat_write_header(_fmt_ctx, &opt);//no need to set this
  566. ret = avformat_write_header(_fmt_ctx, NULL);
  567. av_dict_free(&opt);
  568. if (ret < 0) {
  569. error = AE_FFMPEG_WRITE_HEADER_FAILED;
  570. break;
  571. }
  572. } while (0);
  573. return error;
  574. }
  575. void muxer_ffmpeg::cleanup_video()
  576. {
  577. if (!_v_stream)
  578. return;
  579. if (_v_stream->v_enc)
  580. delete _v_stream->v_enc;
  581. if (_v_stream->v_sws)
  582. delete _v_stream->v_sws;
  583. delete _v_stream;
  584. _v_stream = nullptr;
  585. }
  586. void muxer_ffmpeg::cleanup_audio()
  587. {
  588. if (!_a_stream)
  589. return;
  590. if (_a_stream->a_enc)
  591. delete _a_stream->a_enc;
  592. if (_a_stream->a_filter_amix)
  593. delete _a_stream->a_filter_amix;
  594. if (_a_stream->a_nb) {
  595. for (int i = 0; i < _a_stream->a_nb; i++) {
  596. if (_a_stream->a_filter_aresample && _a_stream->a_filter_aresample[i])
  597. delete _a_stream->a_filter_aresample[i];
  598. if (_a_stream->a_samples && _a_stream->a_samples[i]) {
  599. delete[] _a_stream->a_samples[i]->buff;
  600. delete _a_stream->a_samples[i];
  601. }
  602. if (_a_stream->a_resamples && _a_stream->a_resamples[i]) {
  603. delete[] _a_stream->a_resamples[i]->buff;
  604. delete _a_stream->a_resamples[i];
  605. }
  606. }
  607. if (_a_stream->a_filter_aresample)
  608. delete[] _a_stream->a_filter_aresample;
  609. if (_a_stream->a_samples)
  610. delete[] _a_stream->a_samples;
  611. if (_a_stream->a_resamples)
  612. delete[] _a_stream->a_resamples;
  613. }
  614. delete _a_stream;
  615. _a_stream = nullptr;
  616. }
  617. void muxer_ffmpeg::cleanup()
  618. {
  619. cleanup_video();
  620. cleanup_audio();
  621. if (_fmt && !(_fmt->flags & AVFMT_NOFILE))
  622. avio_closep(&_fmt_ctx->pb);
  623. if (_fmt_ctx) {
  624. avformat_free_context(_fmt_ctx);
  625. }
  626. _fmt_ctx = NULL;
  627. _fmt = NULL;
  628. _inited = false;
  629. }
  630. uint64_t muxer_ffmpeg::get_current_time()
  631. {
  632. std::lock_guard<std::mutex> lock(_time_mutex);
  633. return av_gettime_relative();
  634. }
  635. int muxer_ffmpeg::write_video(AVPacket *packet)
  636. {
  637. //must lock here,coz av_interleaved_write_frame will push packet into a queue,and is not thread safe
  638. std::lock_guard<std::mutex> lock(_mutex);
  639. packet->stream_index = _v_stream->st->index;
  640. /*packet->pts = av_rescale_q_rnd(packet->pts,
  641. _v_stream->v_src->get_time_base(),
  642. { 1,AV_TIME_BASE },
  643. (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
  644. // make audio and video use one clock
  645. if (_v_stream->pre_pts == (uint64_t)-1) {
  646. _v_stream->pre_pts = packet->pts;
  647. }*/
  648. // scale ts with timebase of base_time
  649. av_packet_rescale_ts(packet, _v_stream->v_src->get_time_base(), { 1,AV_TIME_BASE });
  650. // make audio and video use one clock
  651. packet->pts = packet->pts - _base_time;
  652. packet->dts = packet->pts;//make sure that dts is equal to pts
  653. av_packet_rescale_ts(packet, { 1,AV_TIME_BASE }, _v_stream->st->time_base);
  654. al_debug("V:%lld", packet->pts);
  655. av_assert0(packet->data != NULL);
  656. int ret = av_interleaved_write_frame(_fmt_ctx, packet);//no need to unref packet,this will be auto unref
  657. if (ret != 0) {
  658. al_fatal("write video frame error:%d", ret);
  659. }
  660. return ret;
  661. }
  662. int muxer_ffmpeg::write_audio(AVPacket *packet)
  663. {
  664. std::lock_guard<std::mutex> lock(_mutex);
  665. packet->stream_index = _a_stream->st->index;
  666. AVRational src_timebase = { 1,1 };
  667. if (_a_stream->a_filter_amix != nullptr) {
  668. src_timebase = _a_stream->a_filter_amix->get_time_base();
  669. }
  670. else {
  671. src_timebase = _a_stream->a_filter_aresample[0]->get_time_base();
  672. }
  673. /*packet->pts = av_rescale_q_rnd(packet->pts,
  674. src_timebase,
  675. { 1,AV_TIME_BASE },
  676. (AVRounding)(AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX));
  677. if (_v_stream->pre_pts == (uint64_t)-1) {
  678. _v_stream->pre_pts = packet->pts;
  679. }*/
  680. // scale ts with timebase of base_time
  681. av_packet_rescale_ts(packet, src_timebase, { 1,AV_TIME_BASE });
  682. // make audio and video use one clock
  683. packet->pts = packet->pts - _base_time;
  684. packet->dts = packet->pts;//make sure that dts is equal to pts
  685. av_packet_rescale_ts(packet, { 1,AV_TIME_BASE }, _a_stream->st->time_base);
  686. al_debug("A:%lld %lld", packet->pts, packet->dts);
  687. av_assert0(packet->data != NULL);
  688. int ret = av_interleaved_write_frame(_fmt_ctx, packet);//no need to unref packet,this will be auto unref
  689. if (ret != 0) {
  690. al_fatal("write audio frame error:%d", ret);
  691. }
  692. return ret;
  693. }
  694. }