Hi, while trying to use FFmpeg libs as a developer I found the following: When decoding sound from some compressed audio formats and doing a seek, the first decoded packet after seeking is buggy. I had this with some mp4 files with aac audio codec and some wmv files with wma audio codec. Looks like some leftovers from internal buffers - but I am using 'avcodec_flush_buffers'! That of course leads to nasty sound noise/clicks. See sourcecode below. Basically it shows the first few bytes of the first decoded sound packet then seeks back and shows the first packets decoding again. If you use it with some wmv or mp4 file with sound you should see see effect that both outputs at 0 are different but should be equal. Just make sure the sound is not only silence at the first 10 packets. Or am I missing some other flush...whatever function here? I am developing under windows using the actual ffmpeg git version. Confirmed for 32 and 64 bit version, self compiled and downloaded autobuilds. // *** Sourcecode from here *** AVFormatContext *pFormatCtx = NULL; AVPacket packet; AVStream *pSoundStream = NULL; AVCodec *pSoundCodec = NULL; unsigned char *pSoundDecodeBuff; const int SoundDecodeBuffSize = (AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2; // Decode next sound packet, print some data and return timestamp int64_t DecodeSoundPacket() { while (av_read_frame(pFormatCtx, &packet) >= 0) { if (packet.stream_index == pSoundStream->index) { int nBuff = SoundDecodeBuffSize; int used = avcodec_decode_audio3(pSoundStream->codec, (int16_t*)pSoundDecodeBuff, &nBuff, &packet); if (used != packet.size) printf("Problem while decoding!\n"); // This also indicates multi frame packets av_free_packet(&packet); break; } av_free_packet(&packet); } printf("Packet at %.2f:", (float)packet.dts * pSoundStream->time_base.num / pSoundStream->time_base.den); for (int i = 0; i < 20; i++) printf(" %.2x", (int)pSoundDecodeBuff[i]); printf("\n"); return packet.dts; } int main(int argc, char* argv[]) { // Open media file av_register_all(); if(av_open_input_file(&pFormatCtx, "D:\\Projekte\\VideoTest\\VideoTest_1280x720_29p_h264_Audio48k.mp4", NULL, 0, NULL) != 0) return -1; if(av_find_stream_info(pFormatCtx) < 0) return -1; // Find the first sound stream for(int i = 0; i < (int)pFormatCtx->nb_streams; i++) if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { pSoundStream = pFormatCtx->streams[i]; break; } if(pSoundStream == NULL) return -1; // Open the decoder for the sound stream pSoundCodec = avcodec_find_decoder(pSoundStream->codec->codec_id); if (pSoundCodec==NULL) return -1; if (avcodec_open(pSoundStream->codec, pSoundCodec) < 0) return -1; pSoundDecodeBuff = (unsigned char*)av_malloc(SoundDecodeBuffSize); // Decode first packet and some others int64_t SeekTo = DecodeSoundPacket(); for (int i = 0; i < 10; i++) DecodeSoundPacket(); // Seek back printf("\nSeeking now...\n\n"); av_seek_frame(pFormatCtx, pSoundStream->index, SeekTo, AVSEEK_FLAG_BACKWARD); avcodec_flush_buffers(pSoundStream->codec); // Enable this and the bug is gone //avcodec_close(pSoundStream->codec); //avcodec_open(pSoundStream->codec, pSoundCodec); // Decode first packet again DecodeSoundPacket(); // No cleanup - I am soooo dirty }