总入口

http://blog.csdn.net/leixiaohua1020/article/details/15811977

各结构体介绍

http://blog.csdn.net/leixiaohua1020/article/details/14215833

简单的ffmpeg+sdl例子视频教学

http://blog.csdn.net/leixiaohua1020/article/details/47068015

关于解码与播放,例子是音频

http://blog.csdn.net/leixiaohua1020/article/details/46890259

ffmpeg函数调用流程

http://zhuang0393.blog.163.com/blog/static/9285104201302174532913/

/*示例代码*/
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h> int main(int argc, char **argv)
{
uint8_t * out_buffer;
AVCodec *pCodec; // 表示音视频编解码器
AVFrame *pFrame; // 原始数据
AVFrame *pFrameYUV;
AVPacket packet; // 代表音视频数据帧
AVCodecContext *pCodecCtx; // 当前 Codec 使用的上下文
AVFormatContext *pFormatCtx;//当前文件容器格式使用的上下文
char filepath[] = "1.mp4";
int got_picture, videoStream, i; av_register_all(); //注册所有的编解码器,复用/解复用器等等组件。
avformat_network_init(); //网络流初始化
pFormatCtx = avformat_alloc_context();   //打开文件并读取头信息
    if (avformat_open_input(&pFormatCtx,filepath,NULL,NULL) != 0){
        printf("%s, %d\n", __func__, __LINE__);
        return 1;
    }   //查找 stream info
    if (avformat_find_stream_info(pFormatCtx,NULL) < 0) {
        printf("%s, %d\n", __func__, __LINE__);
        return 1;
    }     // 查找第一个视频流
    videoStream = -1;
    for(i = 0 ;i < pFormatCtx->nb_streams; i++ )
        if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO)
        {   
            videoStream = i ;
            break;
        }   
    if (videoStream == -1)
        return -1;     pCodecCtx = pFormatCtx ->streams[videoStream]->codec;   //查找解码器
    pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
  //打开解码器
    avcodec_open2(pCodecCtx, pCodec,NULL);
  
    pFrame=av_frame_alloc();
    out_buffer=(uint8_t *)av_malloc(avpicture_get_size(AV_PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height));   //循环读取视频帧
    while (av_read_frame(pFormatCtx, &packet) >= 0) {         printf("index: %d\n", packet.stream_index); // ==videoStream则为视频帧
        avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, &packet); //解码一帧     //获得sws上下文句柄
        struct SwsContext *img_convert_ctx = NULL;
        img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt,
                pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL);     //执行自定义转换
        sws_scale(img_convert_ctx, (const uint8_t* const*)pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameYUV->data, pFrameYUV->linesize);
        /*
      这边已经得到一个yuv420p格式的AVFrame原始数据, 我们可以
      1. 把数据保存成一帧一帧的图片
      2. 可以用sdl库直接播放出来
    */
     sws_freeContext(img_convert_ctx);
        av_free_packet(&packet);
    }     av_frame_free(&pFrame);
    avcodec_close(pCodecCtx);
    avformat_close_input(&pFormatCtx);
}

ffmpeg入门的更多相关文章

  1. FFmpeg入门,简单播放器

    一个偶然的机缘,好像要做直播相关的项目 为了筹备,前期做一些只是储备,于是开始学习ffmpeg 这是学习的第一课 做一个简单的播放器,播放视频画面帧 思路是,将视频文件解码,得到帧,然后使用定时器,1 ...

  2. FFmpeg 入门(7):Seeking

    本文转自:FFmpeg 入门(7):Seeking | www.samirchen.com 处理 seek 命令 我们将为播放器添加 seek 的能力.这个过程中,我们会看到 av_seek_fram ...

  3. FFmpeg 入门(6):音频同步

    本文转自:FFmpeg 入门(6):音频同步 | www.samirchen.com 音频同步 上一节我们做了将视频同步到音频时钟,这一节我们反过来,将音频同步到视频.首先,我们要实现一个视频时钟来跟 ...

  4. FFmpeg 入门(5):视频同步

    本文转自:FFmpeg 入门(5):视频同步 | www.samirchen.com 视频如何同步 在之前的教程中,我们已经可以开始播放视频了,也已经可以开始播放音频了,但是视频和音频的播放还未同步, ...

  5. FFmpeg 入门(4):线程分治

    本文转自:FFmpeg 入门(4):线程分治 | www.samirchen.com 概览 上一节教程中,我们使用 SDL 的音频相关的函数来支持音频播放.SDL 起了一个线程来在需要音频数据的时候去 ...

  6. FFmpeg 入门(2):输出视频到屏幕

    本文转自:FFmpeg 入门(2):输出视频到屏幕 | www.samirchen.com SDL 我们这里使用 SDL 来渲染视频到屏幕.SDL 是 Simple Direct Layer 的缩写, ...

  7. FFmpeg 入门(3):播放音频

    本文转自:FFmpeg 入门(3):播放音频 | www.samirchen.com 音频 SDL 提供了播放音频的方法.SDL_OpenAudio 函数用来让设备播放音频,它需要我们传入一个包含了所 ...

  8. FFmpeg 入门(1):截取视频帧

    本文转自:FFmpeg 入门(1):截取视频帧 | www.samirchen.com 背景 在 Mac OS 上如果要运行教程中的相关代码需要先安装 FFmpeg,建议使用 brew 来安装: // ...

  9. FFMPEG 入门

    1. 下载网站:https://ffmpeg.zeranoe.com/builds/ 先后下载 Win32 Shared 和 Win32 Dev 两个版本,分别解压缩. 2. 用Visual Stud ...

随机推荐

  1. js 控制展开折叠 div html dom

    js 控制展开折叠 div    html dom <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" ...

  2. 用PHPcms V9四步完成WAP手机站搭建

    用PHPCMS最新发布的V9搭建了ONOW中文网,WEB网站(www.onow.cn)完成后,有用户提供手机访问的问题, 于是着手搭建ONOW手机WAP站(3g.onow.cn). 用PHPCMS V ...

  3. jquery获取、改变元素属性值

    //标签的属性称作元素属性,在JS里对应的DOM对象的对应属性叫DOM属性.JS里的DOM属性名有时和原元素属性名不同. //==================================操作元 ...

  4. hdu 2232 矩阵 ***

    一天四个不同的机器人a.b.c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同 ...

  5. 【译】安装Sonar要求

    本文仅为本人看sonar官方文档时,因其为英文,故简单整理翻译[英语不好,见谅!] http://docs.sonarqube.org/display/SONAR/Requirements   目录 ...

  6. 映射一对多双向关联关系 cascade、inverse、属性

    当类与类之间建立了关联,就可以方便的从一个对象导航到另一个对象.或者通过集合导航到一组对象.例如: 对于给定的Emp对象,如果想获得与它关联的Dept对象,只要调用如下方法 Dept dept=emp ...

  7. 【hibernate 报错】No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer 【get和load的区别】

    报错: HTTP Status 500 - Could not write content: No serializer found for class org.hibernate.proxy.poj ...

  8. Chrome浏览器之 Postman 安装

    Postman 是一款发送 HTTP 请求的 Chrome 插件.开发后端程序的同学可以用它来测试自己写的应用程序是否能够正常访问. 现在由于国内的网络限制, Chrome 浏览器里无法访问“扩展程序 ...

  9. 【转】Linux 查看内存(free buffer cache)

    转自:http://elf8848.iteye.com/blog/1995638 Linux下如何查内存信息,如内存总量.已使用量.可使用量.经常使用Windows操作系统的朋友,已经习惯了如果空闲的 ...

  10. 用div,ul,input模拟select下拉框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...