El 26/04/2017 a las 22:32, luigi escribió:
Hello,

I'm trying to decode effectively audio in an .avi video file with

decode_audio4, etc.

I succeed as long as the decoded frames are stereo, but when I bump into avi files which have 5.1 channels I get weird audio reproduction.

I have so far tried to resample (swr_convert) the decoded frames, but with no success.

    av_opt_set_int(swr_ctx, "in_channel_layout", src_ch_layout, 0);
    av_opt_set_int(swr_ctx, "in_sample_rate",       src_rate, 0);
    av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt", src_sample_fmt, 0);
    av_opt_set_int(swr_ctx, "in_channel_count", dec_fr->channels, 0);

    av_opt_set_int(swr_ctx, "out_channel_layout", dst_ch_layout, 0);
    av_opt_set_int(swr_ctx, "out_sample_rate",       dst_rate, 0);
    av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", dst_sample_fmt, 0);
    av_opt_set_int(swr_ctx, "out_channel_count", 2, 0);

Here, I would like to ask a few questions:

1) is the "in_channel_layout" the layout of the decoded frame before it is resampled?

Yes.
2) what is it that swr_convert really does?
It converts among different audio channels, mixing them sometimes.
For swr_convert to work you need to have called swr_init() before (after you set the opts).
Example:

                    forw_ctx  = swr_alloc_set_opts(NULL, out_ch_layout,
out_sample_fmt,  out_sample_rate,
in_ch_layout,  in_sample_fmt,
in_sample_rate,
                                                   0, NULL);
                    if(!forw_ctx) {
LOG_ERROR( _("Failed to alloc swresample library") );
                        return 0;
                    }

                    if(swr_init(forw_ctx) < 0)
                    {
                        char buf[256];
av_get_channel_layout_string(buf, 256, -1, in_ch_layout); LOG_ERROR( _("Failed to init swresample library with ")
                                   << buf << " "
                                   << av_get_sample_fmt_name(in_sample_fmt)
<< _(" frequency: ") << in_sample_rate );
                        return 0;
                    }

    int len2 = swr_convert(forw_ctx, (uint8_t**)&samples,
_aframe->nb_samples, // No resampling wanted (const uint8_t **)_aframe->extended_data,
                                       _aframe->nb_samples );

--
Gonzalo Garramuño

_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to