步骤如下:

1. 下载

官网永远是王道,呵呵:http://ffmpeg.org/download.html

或者 svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

2. 编译

    • 运行./configure
      很不幸,运行configure后出现了错误提示:
      yasm not found, use –disable-yasm for a crippled build

      解决方案:sudo apt-getinstall yasm
      重新./configure,搞定

    • make

    • make install
      权限不够需要前面加上sudo

    • 编译源码:一定注意加载库的顺序.

    • 参考代码:
    • #include <SDL/SDL.h>
      
      #include <libavcodec/avcodec.h>
      #include <libavformat/avformat.h>
      #include <stdio.h>
      #include <libswscale/swscale.h> int main(int argc, char *argv[]) {
      AVFormatContext *pFormatCtx;
      int i, videoStream;
      AVCodecContext *pCodecCtx;
      AVCodec *pCodec;
      AVFrame *pFrame;
      AVFrame *pFrameYUV;
      AVPacket packet;
      int frameFinished;
      int numBytes; // Register all formats and codecs
      av_register_all();
      // Open video file
      if (av_open_input_file(&pFormatCtx, "/home/user/workspace/panda/media/video/4f5a9c384d94eb21e5273ec263457535.mp4", NULL, , NULL )
      != ) {
      printf("=== cannot open file\n===");
      return -; // Couldn't open file
      }
      // Retrieve stream information
      if (av_find_stream_info(pFormatCtx) < )
      return -; // Couldn't find stream information
      // Dump information about file onto standard error
      // dump_format(pFormatCtx, 0, argv[1], false);
      // Find the first video stream
      videoStream = -;
      for (i = ; i < pFormatCtx->nb_streams; i++)
      if (pFormatCtx->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO) ////////
      {
      videoStream = i;
      break;
      }
      if (videoStream == -)
      return -; // Didn't find a video stream
      // Get a pointer to the codec context for the video stream
      pCodecCtx = pFormatCtx->streams[videoStream]->codec; //////////
      ///////// SDL initialization
      SDL_Surface *screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, , SDL_HWSURFACE);
      SDL_Overlay *overlay = SDL_CreateYUVOverlay(pCodecCtx->width, pCodecCtx->height, SDL_YV12_OVERLAY, screen);
      static SDL_Rect rect;
      rect.x = ;
      rect.y = ;
      rect.w = pCodecCtx->width;
      rect.h = pCodecCtx->height;
      //////////
      // Find the decoder for the video stream
      pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
      if (pCodec == NULL )
      return -; // Codec not found
      // Open codec
      if (avcodec_open(pCodecCtx, pCodec) < )
      return -; // Could not open codec // Allocate video frame
      pFrame = avcodec_alloc_frame();
      // Allocate an AVFrame structure
      pFrameYUV = avcodec_alloc_frame();
      if (pFrameYUV == NULL )
      return -; static struct SwsContext *img_convert_ctx; img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
      // PIX_FMT_RGB24,
      PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL ); // Set SDL events
      SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
      SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
      SDL_ShowCursor(SDL_DISABLE); // Read frames
      while ((av_read_frame(pFormatCtx, &packet) >= ) && (SDL_PollEvent(NULL ) == )) {
      // 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 YUV, and display SDL_LockYUVOverlay(overlay);
      pFrameYUV->data[] = overlay->pixels[];
      pFrameYUV->data[] = overlay->pixels[];
      pFrameYUV->data[] = overlay->pixels[]; pFrameYUV->linesize[] = overlay->pitches[];
      pFrameYUV->linesize[] = overlay->pitches[];
      pFrameYUV->linesize[] = overlay->pitches[]; // img_convert((AVPicture *) pFrameYUV, PIX_FMT_YUV420P, (AVPicture *) pFrame, pCodecCtx->pix_fmt, pCodecCtx->width,
      // pCodecCtx->height); // other codes
      // Convert the image from its native format to RGB sws_scale(img_convert_ctx, (const uint8_t* const *) pFrame->data, pFrame->linesize, , pCodecCtx->height, pFrameYUV->data,
      pFrameYUV->linesize); SDL_UnlockYUVOverlay(overlay);
      SDL_DisplayYUVOverlay(overlay, &rect);
      ///
      SDL_Delay();
      }
      }
      // Free the packet that was allocated by av_read_frame
      av_free_packet(&packet);
      }
      // Free the RGB image
      av_free(pFrameYUV);
      // Free the YUV frame
      av_free(pFrame);
      // Close the codec
      avcodec_close(pCodecCtx);
      // Close the video file
      av_close_input_file(pFormatCtx);
      //
      SDL_FreeYUVOverlay(overlay);
      return ;
      }
    • 放大播放:
    • #include <SDL/SDL.h>
      
      #include <libavcodec/avcodec.h>
      #include <libavformat/avformat.h>
      #include <stdio.h>
      #include <libswscale/swscale.h> int avcodec_main(int argc, char *argv[]) {
      AVFormatContext *pFormatCtx;
      int i, videoStream;
      AVCodecContext *pCodecCtx;
      AVCodec *pCodec;
      AVFrame *pFrame;
      AVFrame *pFrameYUV;
      AVPacket packet;
      int frameFinished;
      int numBytes; // Register all formats and codecs
      av_register_all();
      // Open video file
      if (av_open_input_file(&pFormatCtx, "/home/user/workspace/panda/media/video/4f5a9c384d94eb21e5273ec263457535.mp4", NULL, 0, NULL )
      != 0) {
      printf("=== cannot open file\n===");
      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], false);
      // 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; ////////// ///////// SDL initialization
      int w = 1920, h = 1080; SDL_Surface *screen = SDL_SetVideoMode(w, h, 0, SDL_HWSURFACE);
      SDL_Overlay *overlay = SDL_CreateYUVOverlay(w, h, SDL_YV12_OVERLAY, screen);
      static SDL_Rect rect;
      rect.x = 0;
      rect.y = 0;
      rect.w = w;
      rect.h = h;
      //////////
      // Find the decoder for the video stream
      pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
      if (pCodec == NULL )
      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
      pFrameYUV = avcodec_alloc_frame();
      if (pFrameYUV == NULL )
      return -1; static struct SwsContext *img_convert_ctx; img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, w, h,
      // PIX_FMT_RGB24,
      PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL ); // Set SDL events
      SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
      SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
      SDL_ShowCursor(SDL_DISABLE); // Read frames
      while ((av_read_frame(pFormatCtx, &packet) >= 0) && (SDL_PollEvent(NULL ) == 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 YUV, and display SDL_LockYUVOverlay(overlay);
      pFrameYUV->data[0] = overlay->pixels[0];
      pFrameYUV->data[1] = overlay->pixels[2];
      pFrameYUV->data[2] = overlay->pixels[1]; pFrameYUV->linesize[0] = overlay->pitches[0];
      pFrameYUV->linesize[1] = overlay->pitches[2];
      pFrameYUV->linesize[2] = overlay->pitches[1]; // img_convert((AVPicture *) pFrameYUV, PIX_FMT_YUV420P, (AVPicture *) pFrame, pCodecCtx->pix_fmt, pCodecCtx->width,
      // pCodecCtx->height); // other codes
      // Convert the image from its native format to RGB sws_scale(img_convert_ctx, (const uint8_t* const *) pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data,
      pFrameYUV->linesize); SDL_UnlockYUVOverlay(overlay);
      SDL_DisplayYUVOverlay(overlay, &rect);
      ///
      SDL_Delay(30);
      }
      }
      // Free the packet that was allocated by av_read_frame
      av_free_packet(&packet);
      }
      // Free the RGB image
      av_free(pFrameYUV);
      // Free the YUV frame
      av_free(pFrame);
      // Close the codec
      avcodec_close(pCodecCtx);
      // Close the video file
      av_close_input_file(pFormatCtx);
      //
      SDL_FreeYUVOverlay(overlay);
      return 0;
      }

        

    • 参考http://hi.baidu.com/xiaomeng008/archive/tag/ffmpeg

    • ffmpeg: http://blog.csdn.net/byxdaz/article/details/7316304

      ffmpeg编译和使用大全     http://lvzun.iteye.com/blog/706121

    • 重点推荐:http://dranger.com/ffmpeg/ An ffmpeg and SDL Tutorial
    • http://www.libsdl.org/release/SDL-1.2.15/test/  SDL官方示例。 overlay有rgb转换到YUV.

ffmpeg 在ubuntu上编译环境搭建和开发的更多相关文章

  1. ubuntu上lamp环境搭建

    首先,介绍个彻底删除linux已经安装的软件的方法. sudo apt-get purge mysql-server mysql-client mysql-common mysql-server-5. ...

  2. Ubuntu下qemu环境搭建vexpress开发平台

    在查找资料过程中,发现自己搭建虚拟的arm环境的话,有一个比较好的软件就是qemu了,当然还有其他的,大家各投所好就好. 接下来说一下qemu环境搭建过程. 其实搭建很简单,作为小白,我还是捣鼓了两三 ...

  3. RabbitMQ系列(一)RabbitMQ在Ubuntu上的环境搭建

    环境配置 Ubuntu Server 18.04 RabbitMQ 3.6.10 安装之前 我们使用apt-get进行RabbitMQ安装,在安装之前,强烈建议您把apt源换位国内,大大增加下载安装的 ...

  4. Ubuntu上CUDA环境搭建

    1.下载CUDA:https://developer.nvidia.com/cuda-toolkit-archive (如果已经安装了N卡驱动,最好用.deb,如果没有安装,可以用.run) 2.根据 ...

  5. RabbitMQ在Ubuntu上的环境搭建

    1.修改/etc/apt/sources.list文件 A:命令:vi /etc/apt/sources.list B:在最后一行加上:deb http://www.rabbitmq.com/debi ...

  6. Ubuntu Desktop开发生产环境搭建

    Ubuntu Desktop开发生产环境搭建 1   开发生产环境搭建 在本节内容开始前,先定义一下使用场合,没有哪种系统或者设备是万能的,都有它的优点和缺点,能够在具体的使用场景,根据自身的需求来取 ...

  7. ubuntu12.04下安卓编译环境搭建总结

    前言:      因为工作需要,经常要编译安卓下的动态库,公司有已经搭建好环境的服务器,但是第一自己想自己搭建一下了解一个整个过程,另外,公司的服务器也经常出现问 题,导致编译不了,所以就想自己搭建环 ...

  8. Tiny4412 开发板 编译环境搭建【转】

    本文转载自:http://blog.csdn.net/beijiwei/article/details/51055369 版权声明:本文为博主原创文章,未经博主允许不得转载. /*********** ...

  9. u-boot 移植(一)编译环境搭建

    u-boot 移植(一)编译环境搭建 soc:s3c2440 board:jz2440 uboot:u-boot-2016.11 toolchain:gcc-linaro-7.4.1-2019.02- ...

随机推荐

  1. asp.net core部署时自定义监听端口,提高部署的灵活性

    另一种方式 https://www.cnblogs.com/stulzq/p/9039836.html 代码截图: 贴一下代码,方便复制: //默认端口号5000 string port = &quo ...

  2. 将 C# 枚举序列化为 JSON 字符串 实践

    一.定义枚举 public enum SiteTypeEnum { 中转部 = 1, 网点 = 2 } 还有 BooleanEnum 和 OptTypeEnum 这两个枚举,这里暂且省略了它们的定义. ...

  3. mysql 通过慢查询日志查写得慢的sql语句

    MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_t ...

  4. Centos6.8下编译安装LAMP的操作记录梳理

    之前用的最多的web框架是LNMP,偶尔也会用到LAMP.接下来简单说下LAMP环境的部署记录,这里选择源码安装的方式: LAMP相关安装包下载地址:https://pan.baidu.com/s/1 ...

  5. java 定时器中任务的启动、停止、再启动

    package com.cvicse.ump.timer.service; import java.util.Date; import java.util.Timer; import com.cvic ...

  6. 《Linux内核设计与实现》 第三章学习笔记

    一.进程 1.进程就是处于执行期的程序(目标码存放在某种存储介质上).但进程并不仅仅局限于一段可执行程序代码,通常进程还要包含其他资源.执行线程,简称线程(thread),是在进程中活动的对象. 2. ...

  7. Java提高篇(1)封装

    三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...

  8. 第三个Sprint ------第四天

    出题代码 package com.app.senior_calculator; import java.io.Serializable; public class Question implement ...

  9. SDN网络虚拟化、资源映射等相关论文粗读

    1. Control Plane Latency with SDN Network Hypervisors: The Cost of Virtualization 年份:2016 来源:IEEE NE ...

  10. Beta阶段敏捷冲刺二

    一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:连接上数据库 (2) 今天计划完成的工作:修改学习界面单词获取 (3) 工作中遇到的困难:虽然前天询 ...