Hi,<div><br></div><div>I have written a program to decode and play music.However,when I use it to decoder mp3 file,a ffmpeg warning showed in screen said "[mp3 @ 0x7fa2492400] Could not update timestamps for skipped samples.".But when I test it with flac file,the warning disappeared.I am new to FFMPEG development,I don't know whether I have done something wrong in my code.Can anyone give me advice for solving this problem?Thanks in advance.</div><div>The following is my code for decoding audio:</div><div><br></div><div>audiodecoder.c:</div><div><div>#include <libavcodec/avcodec.h></div><div>#include <libavformat/avformat.h></div><div>#include <libswresample/swresample.h></div><div>#include "audiodecoder.h"</div><div><br></div><div>static AVFormatContext *pFormatContext = NULL;</div><div>static AVCodec *pCodec = NULL;</div><div>static AVCodecContext *pCodecContext = NULL;</div><div>static AVCodecParameters *pCodecParameters = NULL;</div><div>static int8_t audioStream = -1;</div><div>static SwrContext *pSwrContext = NULL;</div><div>static AVPacket *pPacket = NULL;</div><div>static AVFrame *pFrame = NULL;</div><div>static uint8_t *internalbuffer = NULL;</div><div><br></div><div>int CreateDecoder(const char *filepath,AudioInfo *infos)</div><div>{</div><div>  av_register_all();</div><div>  pFormatContext = avformat_alloc_context();</div><div>  if (avformat_open_input(&pFormatContext, filepath, NULL, NULL) < 0) {</div><div>    ReleaseResources();</div><div>    return -1; // Fail to open file.</div><div>  }</div><div>  if (avformat_find_stream_info(pFormatContext, NULL) < 0) {</div><div>    ReleaseResources();</div><div>    return -1; // Fail to find stram info;</div><div>  }</div><div>  for (int i=0;i<pFormatContext->nb_streams;i++)</div><div>  {</div><div>    if (pFormatContext->streams[i]->codecpar->codec_type ==</div><div>        AVMEDIA_TYPE_AUDIO) {</div><div>      audioStream = i;</div><div>    }</div><div>  }</div><div>  av_dump_format(pFormatContext, 0, filepath, 0);</div><div>  if (audioStream == -1) {</div><div>    ReleaseResources();</div><div>    return -1; // No audio stream found.</div><div>  }</div><div>  pCodecParameters = pFormatContext->streams[audioStream]->codecpar;</div><div>  pCodec = avcodec_find_decoder(pCodecParameters->codec_id);</div><div>  if (pCodec == NULL) {</div><div>    ReleaseResources();</div><div>    return -1; // No codec found.</div><div>  }</div><div>  pCodecContext = avcodec_alloc_context3(pCodec);</div><div>  avcodec_parameters_to_context(pCodecContext,</div><div>                                (const AVCodecParameters *)pCodecParameters);</div><div>  if (avcodec_open2(pCodecContext, (const AVCodec *)pCodec, NULL) < 0) {</div><div>    ReleaseResources();</div><div>    return -1; // Fail ro open codec.</div><div>  }</div><div>  pSwrContext = swr_alloc();</div><div>  pSwrContext = swr_alloc_set_opts(</div><div>      pSwrContext, pCodecContext->channel_layout, AV_SAMPLE_FMT_S16,</div><div>    pCodecContext->sample_rate, pCodecContext->channel_layout,</div><div>      pCodecContext->sample_fmt, pCodecContext->sample_rate, 0, NULL);</div><div>  swr_init(pSwrContext);</div><div>  pPacket = av_packet_alloc();</div><div>  pFrame = av_frame_alloc();</div><div>  infos->channels = pCodecContext->channels;</div><div>  infos->samplerate = pCodecContext->sample_rate;</div><div>  infos->duration = ((pFormatContext->duration) * 1000) / AV_TIME_BASE;</div><div>  return 0;</div><div>}</div><div>  int getAudioSource(void **buffer,size_t *buffersize){</div><div>   while(av_read_frame(pFormatContext,pPacket)>=0)</div><div>      {</div><div>    if (pPacket->stream_index == audioStream) {</div><div>      int ret = avcodec_send_packet(pCodecContext, pPacket);</div><div>      if (ret < 0) {</div><div>        return -1; // Fail to decode frame.</div><div>      }</div><div>      ret = avcodec_receive_frame(pCodecContext, pFrame);</div><div>      if (ret < 0) {</div><div>        return -1; // Fail to decode frame.</div><div>      }</div><div>      size_t sizes = av_samples_get_buffer_size(NULL, pFrame->channels,pFrame->nb_samples,pCodecContext->sample_fmt, 1);</div><div>      if (internalbuffer != NULL) {</div><div>        av_free(internalbuffer);</div><div>      }</div><div>      </div><div>      internalbuffer = av_malloc(sizeof(uint8_t)*sizes);</div><div>          swr_convert(pSwrContext, &internalbuffer, sizes,</div><div>                   (const uint8_t **)pFrame->extended_data,</div><div>                   pFrame->nb_samples);</div><div>      *buffer = internalbuffer;</div><div>      *buffersize = sizes;</div><div>      return 0;</div><div>    }</div><div>   }</div><div>   return -1;</div><div>  }</div><div>  void ReleaseResources(void) {</div><div>    audioStream = -1;</div><div>    if (pFrame != NULL) {</div><div>      av_frame_unref(pFrame);</div><div>      pFrame = NULL;</div><div>    }</div><div>    if (pPacket != NULL) {</div><div>      av_packet_unref(pPacket);</div><div>      pPacket = NULL;</div><div>    }</div><div>    if (pSwrContext != NULL) {</div><div>      swr_free(&pSwrContext);</div><div>      pSwrContext = NULL;</div><div>    }</div><div>    if (internalbuffer != NULL) {</div><div>      av_free(internalbuffer);</div><div>      internalbuffer = NULL;</div><div>    }</div><div>    if (pCodecParameters != NULL) {</div><div>      avcodec_parameters_free(&pCodecParameters);</div><div>      pCodecParameters = NULL;</div><div>    }</div><div>    avcodec_close(pCodecContext);</div><div>    if (pCodec != NULL) {</div><div>      pCodec = NULL;</div><div>    }</div><div>    if (pCodecContext != NULL) {</div><div>      avcodec_free_context(&pCodecContext);</div><div>      pCodecContext = NULL;</div><div>    }</div><div>    avformat_close_input(&pFormatContext);</div><div>    if (pFormatContext != NULL) {</div><div>      avformat_free_context(pFormatContext);</div><div>      pFormatContext = NULL;</div><div>    }</div><div>  }</div></div><div><br></div><div>audiodecoder.h:</div><div><div>#ifndef AUDIODECODER_H_</div><div>#define AUDIODECODER_H_</div><div>#include <stdint.h></div><div>#include <stddef.h></div><div>#include <stdlib.h></div><div>#include <SLES/OpenSLES.h></div><div>typedef struct AudioInfo {</div><div>  uint8_t channels;</div><div>  size_t samplerate;</div><div>  SLmillisecond duration;</div><div>} AudioInfo;</div><div>int CreateDecoder(const char *filepath, AudioInfo *infos);</div><div>int getAudioSource(void **buffer,size_t *buffersize);</div><div>void ReleaseResources(void);</div><div>#endif /* AUDIODECODER_H_ */</div></div><div><br></div>