首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

下载了一个用ffmpeg的libavcodec和libavformat编写的播放器程序,编译总失败?该怎么解决

2012-02-02 
下载了一个用ffmpeg的libavcodec和libavformat编写的播放器程序,编译总失败???我在网上下载了一个用ffmpeg

下载了一个用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");
  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;
}



[解决办法]

引用楼主 zfm850722 的帖子:
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'呢?

[解决办法]
另外也可以用 gcc 来看看搜索路径里面有没有包括需要的函数库...

Perl code
[root@test0 linux-2.6.29]# gcc -print-search-dirsinstall: /usr/lib/gcc/i386-redhat-linux/4.3.2/programs: =/usr/libexec/gcc/i386-redhat-linux/4.3.2/:/usr/libexec/gcc/i386-redhat-linux/4.3.2/:/usr/libexec/gcc/i386-redhat-linux/:/usr/lib/gcc/i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/:/usr/libexec/gcc/i386-redhat-linux/4.3.2/:/usr/libexec/gcc/i386-redhat-linux/:/usr/lib/gcc/i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/:/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../i386-redhat-linux/bin/i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../i386-redhat-linux/bin/libraries: =/usr/lib/gcc/i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../i386-redhat-linux/lib/i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../../i386-redhat-linux/lib/:/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../i386-redhat-linux/4.3.2/:/usr/lib/gcc/i386-redhat-linux/4.3.2/../../../:/lib/i386-redhat-linux/4.3.2/:/lib/:/usr/lib/i386-redhat-linux/4.3.2/:/usr/lib/ 


[解决办法]
哎,你的代码太难看了,加上语法高亮显示...
[解决办法]

Perl code
gcc -o tutorial01 tutorial01.c -lavutil -lavformat -lavcodec -lz gcc -o tutorial02 tutorial02.c -lavutil -lavformat -lavcodec -lz -lm `sdl-config --cflags --libs`
[解决办法]
Perl code
-Ldir           Add directory dir to the list of directories to be searched for -l.
[解决办法]
你好,我也正在学习ffmpeg,请问你的ffmpeg是怎么安装的啊,怎么我装上了编译tutorial01.c都要出错了,
命令gcc -o tutorial01 tutorial01.c -lavformat -lavcodec -lz,提示找不到lz,然后我把lz去掉编译,
居然提示ffmpeg-0.5里的很多错误,是怎么回事啊,希望得到你的指点,我的邮箱是munpk@126.com.谢谢
[解决办法]
Perl code
# gcc ‘sdl-config --cflags' -o tutorial02 tutorial02.c -lavutil -lavformat -lavcodec -lz -lm `sdl-config --libs` 

热点排行