Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1170353
  • 博文数量: 173
  • 博客积分: 4048
  • 博客等级:
  • 技术积分: 2679
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 18:53
文章分类

全部博文(173)

文章存档

2018年(1)

2016年(1)

2013年(1)

2012年(118)

2011年(52)

分类: 嵌入式

2011-12-09 15:46:01

totorial02需要安装sdl。用如下命令安装
sudo apt-get install libsdl1.2-dev
安装完后,编译totorial02.c的命令为:
gcc -o tutorial02 tutorial02.c -lavformat -lavcodec -lz -lm -lswscale `sdl-config --cflags --libs`

totorial02.c源程序如下:

// tutorial02.c
// A pedagogical video player that will stream through every video frame as fast as it can.
//
// Code based on FFplay, Copyright (c) 2003 Fabrice Bellard,
// and a tutorial by Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)
// Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1
// Use
//
// gcc -o tutorial02 tutorial02.c -lavformat -lavcodec -lz -lm -lswscale `sdl-config --cflags --libs`
// to build (assuming libavformat and libavcodec are correctly installed,
// and assuming you have sdl-config. Please refer to SDL docs for your installation.)
//
// Run using
// tutorial02 myvideofile.mpg
//
// to play the video stream on your screen.

#include  
#include  
#include  
 
#include  
#include  
 
#include  
 
int main(int argc, char *argv[]) { 
    AVFormatContext *pFormatCtx; 
    int     i, videoStream; 
    AVCodecContext  *pCodecCtx; 
    AVCodec     *pCodec; 
    AVFrame     *pFrame; 
    AVPacket    packet; 
    int     frameFinished; 
    float       aspect_ratio; 
    struct SwsContext *img_convert_ctx; 
 
    SDL_Overlay *bmp; 
    SDL_Surface *screen; 
    SDL_Rect    rect; 
    SDL_Event   event; 
 
    if (argc < 2) { 
        fprintf(stderr, "Usage: test \n"); 
        exit(1); 
    } 
 
    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); 
    } 
 
    if (av_open_input_file(&pFormatCtx, argv[1], NULL, 0, NULL) != 0) { 
        return -1; 
    } 
 
    if (av_find_stream_info(pFormatCtx) < 0) { 
        return -1; 
    } 
 
    dump_format(pFormatCtx, 0, argv[1], 0); 
 
    videoStream = -1; 
    for (i=0 ; inb_streams ; i++) { 
        if (pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) { 
            videoStream = i; 
            break; 
        } 
    } 
    if (videoStream == -1) { 
        return -1; 
    } 
 
    pCodecCtx = pFormatCtx->streams[videoStream]->codec; 
    img_convert_ctx = sws_getContext( 
            pCodecCtx->width,  
            pCodecCtx->height, 
            pCodecCtx->pix_fmt,  
            pCodecCtx->width,  
            pCodecCtx->height,  
            PIX_FMT_YUV420P,  
            //PIX_FMT_RGB24,  
            SWS_BICUBIC,  
            NULL, NULL, NULL); 
 
 
    pCodec = avcodec_find_decoder(pCodecCtx->codec_id); 
    if (pCodec == NULL) { 
        fprintf(stderr, "Unsupportd codec!\n"); 
        return -1; 
    } 
 
    if (avcodec_open(pCodecCtx, pCodec) < 0) { 
        return -1; 
    } 
 
    pFrame = avcodec_alloc_frame(); 
 
    screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 24, 0); 
 
    if (!screen) { 
        fprintf(stderr, "SDL: could not set video mode - exiting\n"); 
        exit(1); 
    } 
 
    bmp = SDL_CreateYUVOverlay(pCodecCtx->width, 
                       pCodecCtx->height, 
                   SDL_YV12_OVERLAY, 
                   screen); 
    while(av_read_frame(pFormatCtx, &packet) >= 0) { 
        if (packet.stream_index == videoStream) { 
            avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
                         packet.data, packet.size); 
 
            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]; 
 
                //img_convert(&pict, PIX_FMT_YUV420P, 
                //      (AVPicture*)pFrame, pCodecCtx->pix_fmt, 
                //      pCodecCtx->width, pCodecCtx->height); 
                sws_scale(img_convert_ctx,  
                      pFrame->data,  
                      //(const uint8_t **)pFrame->data,  
                      pFrame->linesize, 0,  
                      pCodecCtx->height,  
                      pict.data,  
                      pict.linesize); 
 
                SDL_UnlockYUVOverlay(bmp); 
 
                rect.x = 0; 
                rect.y = 0; 
                rect.w = pCodecCtx->width; 
                rect.h = pCodecCtx->height; 
                SDL_DisplayYUVOverlay(bmp, &rect); 
            } 
        } 
 
        av_free_packet(&packet); 
        SDL_PollEvent(&event); 
        switch(event.type) { 
            case SDL_QUIT: 
                SDL_Quit(); 
                exit(0); 
                break; 
            default: 
                break; 
        } 
        SDL_Delay(100); 
    } 
 
    av_free(pFrame); 
 
    avcodec_close(pCodecCtx); 
 
    av_close_input_file(pFormatCtx); 
 
    return 0; 
}


阅读(1698) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~