ffmpeg 0.6.3 能用的tutorial02

来源:互联网 发布:淘宝店铺招牌多少钱 编辑:程序博客网 时间:2024/06/04 18:47


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 <libavcodec/avcodec.h>  
#include <libavformat/avformat.h>  
#include <libswscale/swscale.h>  
  
#include <SDL.h>  
#include <SDL_thread.h>  
  
#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;  
    struct SwsContext *img_convert_ctx;  
  
    SDL_Overlay *bmp;  
    SDL_Surface *screen;  
    SDL_Rect    rect;  
    SDL_Event   event;  
  
    if (argc < 2) {  
        fprintf(stderr, "Usage: test <file>\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 ; i<pFormatCtx->nb_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;  
}

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 <libavcodec/avcodec.h>  
#include <libavformat/avformat.h>  
#include <libswscale/swscale.h>  
  
#include <SDL.h>  
#include <SDL_thread.h>  
  
#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;  
    struct SwsContext *img_convert_ctx;  
  
    SDL_Overlay *bmp;  
    SDL_Surface *screen;  
    SDL_Rect    rect;  
    SDL_Event   event;  
  
    if (argc < 2) {  
        fprintf(stderr, "Usage: test <file>\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 ; i<pFormatCtx->nb_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;  
}