1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| char args[512] = {0}; const AVFilter *amix = avfilter_get_by_name("amix"); audio_mix_info_->filterCtx = avfilter_graph_alloc_filter(filter_graph_, amix, "amix");
snprintf(args, sizeof(args), "inputs=%d:duration=%s:dropout_transition=0", audio_input_info_.size(), duration); if (avfilter_init_str(audio_mix_info_->filterCtx, args) != 0) { printf("[AudioMixer] avfilter_init_str(amix) failed.\n"); return -1; }
const AVFilter *abuffersink = avfilter_get_by_name("abuffersink"); audio_sink_info_->filterCtx = avfilter_graph_alloc_filter(filter_graph_, abuffersink, "sink"); if (avfilter_init_str(audio_sink_info_->filterCtx, nullptr) != 0) { printf("[AudioMixer] avfilter_init_str(abuffersink) failed.\n"); return -1; }
for (auto& iter : audio_input_info_) { const AVFilter *abuffer = avfilter_get_by_name("abuffer"); snprintf(args, sizeof(args), "sample_rate=%d:sample_fmt=%s:channel_layout=0x%I64x", iter.second.samplerate, av_get_sample_fmt_name(iter.second.format), av_get_default_channel_layout(iter.second.channels)); printf("[AudioMixer] input(%d) args: %s\n", iter.first, args);
iter.second.filterCtx = avfilter_graph_alloc_filter(filter_graph_, abuffer, audio_output_info_->name.c_str());
if (avfilter_init_str(iter.second.filterCtx, args) != 0) { printf("[AudioMixer] avfilter_init_str(abuffer) failed.\n"); return -1; } if (avfilter_link(iter.second.filterCtx, 0, audio_mix_info_->filterCtx, iter.first) != 0) { printf("[AudioMixer] avfilter_link(abuffer(%d), amix) failed.", iter.first); return -1; } }
if (audio_output_info_ != nullptr) { const AVFilter *aformat = avfilter_get_by_name("aformat"); snprintf(args, sizeof(args), "sample_rates=%d:sample_fmts=%s:channel_layouts=0x%I64x", audio_output_info_->samplerate, av_get_sample_fmt_name(audio_output_info_->format), av_get_default_channel_layout(audio_output_info_->channels)); printf("[AudioMixer] output args: %s\n", args); audio_output_info_->filterCtx = avfilter_graph_alloc_filter(filter_graph_, aformat, "aformat");
if (avfilter_init_str(audio_output_info_->filterCtx, args) != 0) { printf("[AudioMixer] avfilter_init_str(aformat) failed. %s\n", args); return -1; }
if (avfilter_link(audio_mix_info_->filterCtx, 0, audio_output_info_->filterCtx, 0) != 0) { printf("[AudioMixer] avfilter_link(amix, aformat) failed.\n"); return -1; }
if (avfilter_link(audio_output_info_->filterCtx, 0, audio_sink_info_->filterCtx, 0) != 0) { printf("[AudioMixer] avfilter_link(aformat, abuffersink) failed.\n"); return -1; } }
|