2012-08-26 61 views
4

我想执行tutorial01.c使用gcc和我有gcc和tutorial01.c在libavcodec和libavformat相同的文件夹及其关联文件它给了我这个错误致命错误:libavcodec/avcodec.h没有这样的文件或目录编译终止

fatal error: libavcodec/avcodec.h no such file or directory compilation terminated

,当我在Ubuntu上运行gcc -o tutorial01 tutorial01.c -lavformat -lavcodec -lz通过终端12.04

代码

#include libavcodec/avcodec.h 
#include libavformat/avformat.h 
#include stdio.h 

void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) 
{ 
    FILE *pFile; 
    char szFilename[32]; 
    int y; 

    // Open file 
    sprintf(szFilename, "frame%d.ppm", iFrame); 
    pFile=fopen(szFilename, "wb"); 
    if(pFile==NULL) 
    return; 

    // Write header 
    fprintf(pFile, "P6\n%d %d\n255\n", width, height); 
    // Write pixel data 
    for(y=0; y<height; y++) 
    fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile); 

    // Close file 
    fclose(pFile); 
} 

int main(int argc, char *argv[]) 
{ 
    AVFormatContext *pFormatCtx; 
    int    i, videoStream; 
    AVCodecContext *pCodecCtx; 
    AVCodec   *pCodec; 
    AVFrame   *pFrame; 
    AVFrame   *pFrameRGB; 
    AVPacket  packet; 
    int    frameFinished; 
    int    numBytes; 
    uint8_t   *buffer; 

    if(argc < 2) 
    { 
    printf("Please provide a movie file\n"); 
    return -1; 
    } 

    // Register all formats and codecs 
    av_register_all(); 
    // 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(); 

    // Allocate an AVFrame structure 
    pFrameRGB=avcodec_alloc_frame(); 

    if(pFrameRGB==NULL) 
    return -1; 

    // Determine required buffer size and allocate buffer    
numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width, 
        pCodecCtx->height); 

    buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t)); 

    // Assign appropriate parts of buffer to image planes in pFrameRGB 
    // Note that pFrameRGB is an AVFrame, but AVFrame is a superset 
    // of AVPicture 
    avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24, 
     pCodecCtx->width, pCodecCtx->height); 

    // 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) 
     { 
     // Convert the image from its native format to RGB 




    img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24, 
        (AVPicture*)pFrame, pCodecCtx->pix_fmt, pCodecCtx->width, 
        pCodecCtx->height); 




    // Save the frame to disk 

    if(++i<=5) 
    SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height, 
      i); 
     } 
    } 

    // Free the packet that was allocated by av_read_frame 
    av_free_packet(&packet); 
    } 

    // Free the RGB image 
    av_free(buffer); 
    av_free(pFrameRGB); 

    // Free the YUV frame 
    av_free(pFrame); 

// Close the codec 
    avcodec_close(pCodecCtx); 


    // Close the video file 
    av_close_input_file(pFormatCtx); 


    return 0; 

} 
+0

请为您的代码使用代码格式(四位前导空格)! – nneonneo

+0

你编译和编译libavcodec和libavformat吗?或者您是否在您的平台上使用预建的开发包? – nneonneo

+0

我用prebuild开发包 – user1625271

回答

1

您需要将libavcodec和libavformat包含文件的路径添加到您的命令行。找到include /目录,并为每个相关包含文件添加

-Ipath/to/include 

您还需要使用-L为库目录做同样的事情。

+0

你能详细说一下吗?假设我的mk文件的路径是:D:\ ffmpeg \ jni ..然后我运行一个NDK-build来编译它,但是我得到这个错误没有这样的文件。如何添加此路径? –

1

该错误的发生是由于在路径错误

-L /家庭/ yourpath/ffmpeg_build/lib中/

-I /家庭/ yourpath/ffmpeg_build /包括/

ffmpeg_build - 凡文件将被构建并安装库。

实施例:

创建文件 “execute.sh”

现在打开文件并粘贴以下代码:

g++ -Wno-format-zero-length -Wno-write-strings -L/home/yourpath/ffmpeg_build/lib/ -I/home/yourpath/ffmpeg_build/include/ -o output program.cpp -lavcodec -lavformat -lavutil -lavdevice -lswresample -lswscale -lm -lva -lpthread -lvorbis -lvpx -lopus -lz -lpostproc -ldl -lfdk-aac -lmp3lame -lvorbisenc -lvorbisfile -lx264 -ltheora -ltheoraenc -ltheoradec -ldl -lrt -lx265 -lbz2 

和类型:SH execute.sh和二进制将在创建名称“输出” 然后键入./output输出。

注意:以上代码为C++,c代码更改g ++为gcc

相关问题