IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applications et environnements graphiques Discussion :

afficher video avec ffmpeg sdl


Sujet :

Applications et environnements graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 60
    Par défaut afficher video avec ffmpeg sdl
    salut
    je veut faire un programme qui affiche un video dans une interface SDL j'ai eu ce programme de l'internet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    #include <ffmpeg/avcodec.h>
    #include <ffmpeg/avformat.h>
     
    #include <SDL.h>
    #include <SDL_thread.h>
     
    #ifdef __MINGW32__
    #undef main /* Prevents SDL from overriding main() */
    #endif
     
    #include <stdio.h>
     
    int main(int argc, char *argv[]) {
      AVFormatContext *pFormatCtx;
      int             i, videoStream;
      AVCodecContext  *pCodecCtx;
      AVCodec         *pCodec;
      AVFrame         *pFrame; 
      AVPacket        packet;
      int             frameFinished;
      float           aspect_ratio;
     
      SDL_Overlay     *bmp;
      SDL_Surface     *screen;
      SDL_Rect        rect;
      SDL_Event       event;
     
      if(argc < 2) {
        fprintf(stderr, "Usage: test <file>\n");
        exit(1);
      }
      // Register all formats and codecs
      av_register_all();
     
      if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
        fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
        exit(1);
      }
     
      // Open video file
      if(av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL)!=0)
        return -1; // Couldn't open file
     
      // Retrieve stream information
      if(av_find_stream_info(pFormatCtx)<0)
        return -1; // Couldn't find stream information
     
      // Dump information about file onto standard error
      dump_format(pFormatCtx, 0, argv[1], 0);
     
      // Find the first video stream
      videoStream=-1;
      for(i=0; i<pFormatCtx->nb_streams; i++)
        if(pFormatCtx->streams[i]->codec->codec_type==CODEC_TYPE_VIDEO) {
          videoStream=i;
          break;
        }
      if(videoStream==-1)
        return -1; // Didn't find a video stream
     
      // Get a pointer to the codec context for the video stream
      pCodecCtx=pFormatCtx->streams[videoStream]->codec;
     
      // Find the decoder for the video stream
      pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
      if(pCodec==NULL) {
        fprintf(stderr, "Unsupported codec!\n");
        return -1; // Codec not found
      }
     
      // Open codec
      if(avcodec_open(pCodecCtx, pCodec)<0)
        return -1; // Could not open codec
     
      // Allocate video frame
      pFrame=avcodec_alloc_frame();
     
      // Make a screen to put our video
    #ifndef __DARWIN__
            screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);
    #else
            screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 24, 0);
    #endif
      if(!screen) {
        fprintf(stderr, "SDL: could not set video mode - exiting\n");
        exit(1);
      }
     
      // Allocate a place to put our YUV image on that screen
      bmp = SDL_CreateYUVOverlay(pCodecCtx->width,
    				 pCodecCtx->height,
    				 SDL_YV12_OVERLAY,
    				 screen);
     
     
      // Read frames and save first five frames to disk
      i=0;
      while(av_read_frame(pFormatCtx, &packet)>=0) {
        // Is this a packet from the video stream?
        if(packet.stream_index==videoStream) {
          // Decode video frame
          avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
    			   packet.data, packet.size);
     
          // Did we get a video frame?
          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];
     
    	// Convert the image into YUV format that SDL uses
    	img_convert(&pict, PIX_FMT_YUV420P,
                        (AVPicture *)pFrame, pCodecCtx->pix_fmt, 
    		    pCodecCtx->width, pCodecCtx->height);
     
    	SDL_UnlockYUVOverlay(bmp);
     
    	rect.x = 0;
    	rect.y = 0;
    	rect.w = pCodecCtx->width;
    	rect.h = pCodecCtx->height;
    	SDL_DisplayYUVOverlay(bmp, &rect);
     
          }
        }
     
        // Free the packet that was allocated by av_read_frame
        av_free_packet(&packet);
        SDL_PollEvent(&event);
        switch(event.type) {
        case SDL_QUIT:
          SDL_Quit();
          exit(0);
          break;
        default:
          break;
        }
     
      }
     
      // Free the YUV frame
      av_free(pFrame);
     
      // Close the codec
      avcodec_close(pCodecCtx);
     
      // Close the video file
      av_close_input_file(pFormatCtx);
     
      return 0;
    }
    mais lorsque je veut lire un fichier .mpg avec ce programme le fichier est accéléré quel est le probleme et comment reduire la vitesse de fichier
    j'ai essayer de faire une boucle for dans while(av_read_frame(pFormatCtx, &packet)>=0) mais ça ne marche pas
    merci d'avance

  2. #2
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 23

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/01/2012, 21h38
  2. Réponses: 10
    Dernier message: 10/07/2009, 13h58
  3. affichage du video avec SDL
    Par ranell dans le forum SDL
    Réponses: 18
    Dernier message: 04/12/2008, 18h51
  4. [c ou c++]afficher de la video avec win32
    Par ronan99999 dans le forum Windows
    Réponses: 1
    Dernier message: 18/12/2007, 07h43
  5. video realplayer ne s'affiche pas avec IE
    Par bnoir dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 16/10/2006, 14h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo