[Libav-user] Resample frame to specified number of samples

salsaman salsaman at gmail.com
Wed Jul 26 17:30:10 EEST 2017


Yes, you need to buffer sufficient audio frames to feed to the encoder.

Calculate the number of in samples:

    /* compute src number of samples */
    in_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, c->sample_rate) +
out_nb_samples,
                    in_sample_rate, c->sample_rate, AV_ROUND_DOWN);

then allocate buffers to concatenate the in samples until you have enough
to pass to swr_ctx.


Gabriel.




http://lives-video.com
https://www.openhub.net/accounts/salsaman

On Tue, Jul 25, 2017 at 10:37 PM, Andy Shaules <bowljoman at gmail.com> wrote:

>
>
> On Jul 24, 2017 5:44 AM, "Kerry Loux" <louxkr at gmail.com> wrote:
>
>
>
> On Fri, Jul 21, 2017 at 11:38 PM, Andy Shaules <bowljoman at gmail.com>
> wrote:
>
>>
>>
>> On Jul 19, 2017 10:59 AM, "Kerry Loux" <louxkr at gmail.com> wrote:
>>
>> Hello all,
>>
>> I have an application where I am opening an audio file that was sampled
>> at 44100 Hz, decoding it, resampling to 16000 Hz, encoding it again (AAC)
>> then broadcasting it on an RTSP stream.  On the receiving end, I decode the
>> incoming AAC packets and render them.
>>
>> The rendered audio is very slow.
>>
>> It appears to me that the problem is related to the AVFrame.nb_samples
>> field.  When I read a packet from file (using av_read_frame()), the packet
>> size is 1024 samples (at 44100 Hz).  After I resample to 16000 Hz, I have
>> ~1/3 the samples that I had in the original frame (as expected).  Then, the
>> frame gets encoded, streamed and decoded.  After decoding, the
>> AVFrame.nb_samples is 1024 when I expect it to be 372 or so.  The
>> AVCodecContext passed to avcodec_receive_frame() has frame_size = 1024, so
>> I assume that the decoder is setting the number of samples of the decoded
>> frame to 1024 regardless of the number of samples actually contained in the
>> input packet?  Or maybe it's my job to ensure that the input packets always
>> contain 1024 samples?
>>
>> I'm not entirely sure what's going on.  My thoughts include:
>> - Try buffering 3x number of input frames prior to resampling so the
>> resulting frame will be ~1024 samples
>> - Calculate the number of samples manually (how to do this is unclear)
>> and override the number of samples assigned by the decoder (this seems
>> wrong...)
>>
>> Any recommendations?  Can I just stick multiple frames together in a
>> larger buffer prior to resampling (i.e. calling swr_convert())?
>>
>> Thanks,
>>
>> Kerry
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/libav-user
>>
>>
>>
>> 2 things perhaps. what sample rate does your sdp advertize? what scale
>> are your audio rtp timstamps?
>>
>> _______________________________________________
>> Libav-user mailing list
>> Libav-user at ffmpeg.org
>> http://ffmpeg.org/mailman/listinfo/libav-user
>>
>> SDP correctly advertises 16000 Hz and my timestamps are scaled to
> microseconds.
>
> Thanks,
>
> Kerry
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
> then yes, most likely needing to concatenate frames to the currect
> duration for the sample rate
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20170726/4040d206/attachment.html>


More information about the Libav-user mailing list