[Libav-user] decoding audio with libav

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[Libav-user] decoding audio with libav

luigi-2
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?

2) what is it that swr_convert really does?

Thanks for any help to clarify my ideas

Luigi

_______________________________________________
Libav-user mailing list
[hidden email]
http://ffmpeg.org/mailman/listinfo/libav-user
Reply | Threaded
Open this post in threaded view
|

Re: decoding audio with libav

Gonzalo Garramuño


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
[hidden email]
http://ffmpeg.org/mailman/listinfo/libav-user