hi all,

i am using an updated (latest ffmpeg, SDL 1.2.15, MSVC++) version of
Dranger's tutorial and basically, it works fine.
now, i started to extend it for to play multiple 10-seconds video segments
(gapless), what also works out as long as i don't fill the audio queue. 
but if i do so, as soon it switches to the second segment, i just get some
fast techno-style noise, but video is still running.

here is the code of the main loop:

main(...)
{
...
        while (1)
        {
                while(av_read_frame(pFormatCtx, &packet) >= 0) 
                {
                        if(packet.stream_index == videoStream) 
                        {
                                avcodec_decode_video2(pCodecCtx, pFrame, 
&frameFinished, &packet);

                                if(frameFinished) 
                                {
                                        SDL_LockYUVOverlay(bmp);

                                        AVPicture pict;
                                        pict.data[0] = bmp->pixels[0];
                                        pict.data[1] = bmp->pixels[2];
                                        pict.data[2] = bmp->pixels[1];

                                        pict.linesize[0] = bmp->pitches[0];
                                        pict.linesize[1] = bmp->pitches[2];
                                        pict.linesize[2] = bmp->pitches[1];
                                        
                                        sws_scale(ctx, pFrame->data, 
pFrame->linesize, 0, h,pict.data,
pict.linesize);
                                        //av_picture_copy( (AVPicture*)&pict, 
(AVPicture*)pFrame,
pCodecCtx->pix_fmt, w, h);

                                        SDL_UnlockYUVOverlay(bmp);

                                        rect.x = 0;
                                        rect.y = 0;
                                        rect.w = w;
                                        rect.h = h;
                                        SDL_DisplayYUVOverlay(bmp, &rect);
                                        SDL_Delay(40);
                                }
                        }
                        else if(packet.stream_index == audioStream) 
                        {
                                packet_queue_put(&audioq, &packet);
                        } 
                        else 
                        {
                                av_free_packet(&packet);
                        }

                        SDL_PollEvent(&event);
                        switch(event.type) 
                        {
                                case SDL_QUIT:
                                        quit = 1;
                                        break;
                                case SDL_KEYUP:
                                        if (event.key.keysym.sym == SDLK_ESCAPE)
                                                quit = 1;
                                        break;
                                default:
                                        break;
                        }

                        if (quit)
                        {
                                SDL_Quit();
                                exit(0);
                        }
                }

                av_free(buffer);
                av_free(pFrameRGB);
                av_free(pFrame);
                avcodec_close(pCodecCtx);
                av_close_input_file(pFormatCtx);
                pFormatCtx = avformat_alloc_context();

                fileNo++;

                if (fileNo == 10)
                        break;


                //switch to the next segment file
                char szFilename[5];
                sprintf(szFilename, "%d.asf", fileNo);
                if(avformat_open_input(&pFormatCtx, szFilename, NULL, NULL)!=0)
                        return -1; // Couldn't open file

                //initializing audio and video as done before entering the 
while loop...
                aCodecCtx = pFormatCtx->streams[audioStream]->codec;
                wanted_spec.freq = aCodecCtx->sample_rate;
                wanted_spec.format = AUDIO_S16SYS;
                wanted_spec.channels = aCodecCtx->channels;
                wanted_spec.silence = 0;
                wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
                wanted_spec.callback = audio_callback;
                wanted_spec.userdata = aCodecCtx;

                SDL_OpenAudio(&wanted_spec, &spec); 
                aCodec = avcodec_find_decoder(aCodecCtx->codec_id);
                avcodec_open(aCodecCtx, aCodec);

                packet_queue_init(&audioq);
                SDL_PauseAudio(0);

                pCodecCtx=pFormatCtx->streams[videoStream]->codec;
                pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
                avcodec_open(pCodecCtx, pCodec);
                pFrame=avcodec_alloc_frame();
                pFrameRGB=avcodec_alloc_frame();
                //numBytes = avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,
pCodecCtx->height);
                buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
        }

...
}

int packet_queue_put(PacketQueue *q, AVPacket *pkt) 
{
        AVPacketList *pkt1;
        if(av_dup_packet(pkt) < 0)  
                return -1;
        
        //check mirko:
        pkt1 = (AVPacketList *)av_malloc(sizeof(AVPacketList));
        if (!pkt1)
                return -1;

        pkt1->pkt = *pkt;
        pkt1->next = NULL;

        SDL_LockMutex(q->mutex);

        if (!q->last_pkt)
                q->first_pkt = pkt1;
        else
                q->last_pkt->next = pkt1;
        q->last_pkt = pkt1;
        q->nb_packets++;
        q->size += pkt1->pkt.size;

        SDL_CondSignal(q->cond);
        SDL_UnlockMutex(q->mutex);
        return 0;
}

can anybody give me a hint whats going wrong ?
- or -
is anyone interested in a freelance job ?
todo's would be:
- based on the code above, gapless playing of video/audio of multiple video
segments.
- video output on any given windows form (e.g. a panel) by using 
   SDL_GetWMInfo(SDL_SysWMinfo *info); // SDL_syswm.h
- other things like pause, stop, play, volume control

i will appreciate any question about that!

regards,

Gerald




--
View this message in context: 
http://libav-users.943685.n4.nabble.com/audio-problem-when-playing-multiple-video-segments-tp4647937.html
Sent from the libav-users mailing list archive at Nabble.com.
_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to