日期:2014-05-16  浏览次数:20880 次

下载了一个用ffmpeg的libavcodec和libavformat编写的播放器程序,编译总失败???
我在网上下载了一个用ffmpeg的libavcodec和libavformat编写的播放器程序,编译总是失败,我用这个命令编译:

gcc -o tutorial02 tutorial02.c -lavutil -lavformat -lavcodec -lz -lm `sdl-config --cflags --libs`

错误如下:

tutorial02.c: In function ‘main’:

tutorial02.c:120: warning: ‘avcodec_decode_video’ is deprecated (declared at /usr/local/include/libavcodec/avcodec.h:3156)

/tmp/ccOdJKy3.o: In function `main':

tutorial02.c:(.text+0x382): undefined reference to `img_convert'

collect2: ld returned 1 exit status

为什么总是出现 undefined reference to `img_convert'呢?

大侠帮我看看啊,先谢谢了

源代码如下:
#include <libavcodec/avcodec.h>
#include <libavformat/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");
  e