文档章节

Linux ffmpeg

MtrS
 MtrS
发布于 2017/01/04 16:58
字数 466
阅读 4
收藏 0
#define __STDC_CONSTANT_MACROS

extern "C" {
#include <attributes.h>
#include <avcodec.h>
#include <avformat.h>
#include <swscale.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[]) {
        static AVFormatContext *pFormatCtx;
        int i, videoStream;
        AVCodecContext *pCodecCtx;
        AVCodec *pCodec;
        AVFrame *pFrame;
        AVFrame *pFrameRGB;
        AVPacket packet;
        int frameFinished;
        int numBytes;
        uint8_t *buffer;
        AVDictionary * options;
        // Register all formats and codecs
        av_register_all();

        // Open video file
        if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0)
            return -1; // Couldn't open file

        // Retrieve stream information
        if(avformat_find_stream_info(pFormatCtx,NULL)<0)
            return -1; // Couldn't find stream information

        // Dump information about file onto standard error
        av_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]->codecpar->codec_type==AVMEDIA_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)
            return -1; // Codec not found

        // Open codec
        if(avcodec_open2(pCodecCtx, pCodec,NULL)<0)
            return -1; // Could not open codec

        // Hack to correct wrong frame rates that seem to be generated by some
        // codecs
        // if(pCodecCtx->frame_rate>1000 && pCodecCtx->frame_rate_base==1)
        // pCodecCtx->frame_rate_base=1000;

        // Allocate video frame
        // pFrame = avcodec_alloc_frame();
        pFrame = av_frame_alloc(); 

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

        if(pFrameRGB==NULL)
            return -1;

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

        // Assign appropriate parts of buffer to image planes in pFrameRGB
        avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,
            pCodecCtx->width, pCodecCtx->height);

        // Read frames and save first five frames to disk
        i = 0;
        struct SwsContext *img_convert_ctx = NULL;
        img_convert_ctx = sws_getContext(pCodecCtx->width,pCodecCtx->height,
                pFormatCtx->streams[videoStream]->codecpar->format , 
                pCodecCtx->width, pCodecCtx->height, PIX_FMT_RGB24, SWS_BICUBIC, 
                NULL, NULL, NULL);

        while(av_read_frame(pFormatCtx, &packet)>=0)
        {
            // Is this a packet from the video stream?
            if(packet.stream_index==videoStream)
            {
                // Decode video frame
                frameFinished = 0;
                int ret = avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);
                if(ret < 0)
                {
                    av_log(NULL, AV_LOG_ERROR, "Error decoding video\n");
                    break;
                }
                if(frameFinished)
                {
                    sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
                    if(++i<=1000)
                        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
        delete [] buffer;
        av_free(pFrameRGB);
        // Free the YUV frame
        av_free(pFrame);
        // Close the codec
        avcodec_close(pCodecCtx);
        // Close the video file
        avformat_close_input(&pFormatCtx);
        return 0;
}

© 著作权归作者所有

共有 人打赏支持
MtrS
粉丝 30
博文 549
码字总数 352132
作品 0
榆林
FFMPEG系列二:linux下下载编译安装ffmpeg(超详细附采坑完整版)

一、官网下载linux版本的ffmpeg源码包 ffmpeg-4.0.tar.xz 此步骤也可以使用git clone下载源码包,本质上是一样的 二、使用xftp将源码包ffmpeg-4.0.tar.xz上传至linux主机(直接使用linux命令...

陈守印
07/24
0
0
ffmpeg在windows下视频采集

ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。 ffmpeg在Linux下的...

WuHonghai
2011/11/18
0
0
part02_编译android平台使用的FFmpeg动态库

一、ffmpeg源码目录 一、安装ndk 二、ffmpeg编译 1.下载ffmpeg2.6.9(这个版本比较稳定) wget http://ffmpeg.org/releases/ffmpeg-2.6.9.tar.gz 2.解压 tar -xzf ffmpeg-2.6.9.tar.gz 3.进入......

IT魔幻师
05/09
0
0
FFMPEG在嵌入式硬件上应用之 —— 基本环境搭建及编译

前段时间在翻看电脑里面资料时,发现了以前做的在嵌入式硬件上面运行以ffmepg为基础,以嵌入式硬件解码的多媒体播放工作,发现都快忘记完了。今日得闲整理温习了一下ffmpeg在嵌入式上的运用,...

yang_danny
2015/03/29
0
0
CentOS安装视频转换FFmpeg和切割工具segmenter

一、yum安装FFmpeg 1. 最偷懒的方式就是yum安装了,自动解决依赖。不过CentOS系统默认无FFmpeg源,企业版 Linux 附加软件包EPEL源也不包含,需要手动添加yum源配置/etc/yum.repos.d/dag.repo...

董松
2015/05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DES/3DES(TripleDES)加密、解密测试数据

以下结果经 PHP+openssl及VB.NET验证,ECB模式。 PHP 7.0.10 (cli) (built: Aug 18 2016 09:48:53) ( ZTS ) OpenSSL Library Version: OpenSSL 1.0.1t 3 May 2016 VB.net 2003 ****** DES(S......

SamXIAO
25分钟前
1
0
Java11的新特性

Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 序 本文主要讲述一下Java11的新特性 版本号 java...

go4it
25分钟前
3
0
Maven常用命令及相关笔记

Maven常用命令 dos指令 4. 编译源代码: mvn compile 6. 运行测试: mvn test 8. 打包: mvn package 9. 在本地Repository中安装jar: mvn install 10. 清除产生的项目: mvn clean 4. 运行项...

颖伙虫
32分钟前
1
0
swagger2.2.2 与 spring cloud feign冲突 导致服务请求报空

swagger2.2.2 与 spring cloud feign冲突 Java代码 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.choosefine.web.console.ar......

泉天下
35分钟前
1
0
设计模式之 明确责任 观察者模式 状态模式 责任链模式

观察者模式是任务分发的一种模式。 如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们...

backbye
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部