zoukankan      html  css  js  c++  java
  • ffmpeg结合SDL编写播放器(二)

    我们将对帧数据做一些处理,比如将每一帧的 图像转为jpg或者bmp或者ppm等格式保存下来。

    举例:在ffmpeg-2.8.8文件夹下编写test.c程序

    /*
    test.c
    */
    #include<stdio.h>
    #include<libavcodec/avcodec.h>
    #include<libavformat/avformat.h>
    #include<libswscale/swscale.h>
    
    int main(int argc, char *argv[])
    {
        AVFormatContext *pFormatCtx = NULL;
        if (argc < 2)
        {
            printf("Please provide a movie file
    ");
            return -1;
        }
    
        av_register_all();
        if (avformat_open_input(&pFormatCtx,argv[1], NULL, NULL) != 0)
        {
            return -1;
        }
        if (avformat_find_stream_info(pFormatCtx, NULL) < 0)
        {
            return -1;
        }
    
        av_dump_format(pFormatCtx, 0, argv[1], 0);
        avformat_close_input(&pFormatCtx);
        return 0;
    }

    注册ffmpeg库

    av_register_all(); 

    这会将所有可用的文件格式和编解码器注册到我们的库中,以便在打开具有相应格式/编解码器的文件时自动使用。 注意,我们只需要 av_register_all()一次,所以在 main()中调用。 如果你喜欢,可以只注册某些文件格式和编解码器,但是这样比较麻烦。

    打开文件

    AVFormatContext *pFormatCtx = NULL;
    if (avformat_open_input(&pFormatCtx,argv[1], NULL, NULL) != 0)
    {
        return -1;
    }

    我们从第一个参数获取文件名。 此函数读取文件头并将有关文件格式的信息存储在我们给出的 AVFormatContext 结构中。 最后三个参数用于指定文件格式,缓冲区大小和格式选项,但通过将其设置为NULL或0,libavformat将自动检测这些。 此函数只查看头文件,所以接下来我们需要检查文件中的流信息: 

    if (avformat_find_stream_info(pFormatCtx, NULL) < 0)

    此函数获取有效的数据流,没有就返回 -1。接下来编写一个方便的调试功能,可以显示我们资源的数据信息

    av_dump_format(pFormatCtx, 0, argv[1], 0);    //打印资源信息

    makefile如下:

    DIR_INC = -I/usr/local/include
    DIR_LIB = -L/usr/local/lib
    
    LIBS = -lavformat
            -lavcodec
            -lva-x11 
            -lva 
            -lxcb-shm 
            -lxcb-xfixes 
            -lxcb-render 
            -lxcb-shape 
            -lxcb -lX11 
            -lasound 
            -lz 
            -lswresample 
            -lswscale 
            -lavutil 
            -lm 
            -pthread
    
    FLAGS = -Wall -ggdb
    
    test : test.c
        gcc test.c ${FLAGS} ${DIR_INC} ${DIR_LIB} ${LIBS} -o test
        
    .PHONY:clean
    clean:
        rm test

    运行:

  • 相关阅读:
    [Winform]Media Player com组件应用中遇到的问题
    [Winform]Media Player播放控制面板控制,单击事件截获
    [Winform]Media Player组件全屏播放的设置
    [EF]数据上下文该如何实例化?
    [Winform]在关闭程序后,托盘不会消失的问题
    咏南中间件跨平台解决方案
    硬件中间件
    BASE64使用场景
    DELPHI7 ADO二层升三层新增LINUX服务器方案
    NGINX心跳检测
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11731056.html
Copyright © 2011-2022 走看看