文档章节

Linux ffmpeg

MtrS
 MtrS
发布于 2017/01/04 16:58
字数 466
阅读 4
收藏 0
点赞 0
评论 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
博文 474
码字总数 352132
作品 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

ONVIF协议网络摄像机(IPC)客户端程序开发(12):读取音视频流

1 专栏导读 本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解,专栏前面文章讲过的知识点(或代码段),后面文章不会赘述。为了节省篇幅,突出重点,在文...

benkaoya ⋅ 2017/05/19 ⋅ 0

M3U8下载,直播源下载,FLASH下载(一)-ffmpeg安装手册(windows)

前言 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/...

u_ascend ⋅ 05/23 ⋅ 0

android端采用FFmpeg进行音频混合与拼接剪切

接触FFmpeg有一段时间了,它是音视频开发的开源库,几乎其他所有播放器、直播平台都基于FFmpeg进行二次开发。本篇文章来总结下采用FFmpeg进行音频处理:音频混合、音频剪切、音频拼接与音频转...

mp624183768 ⋅ 05/13 ⋅ 0

FFMPEG命令行处理视频进阶——高阶必读

FFMPEG拥有强大的视频处理能力,可惜的是有很多人不知道如何使用。本文深入介绍如何用编译好ffmpeg.exe程序处理视频,既有常用的简单的处理,也有一些比较少见的高大上的处理,一定能让你受益...

zhangamxqun ⋅ 05/13 ⋅ 0

(iOS) FFmpeg iOS 上的安装(可以指定任意版本) 一

一、准备部分 1、去FFmpeg官网下载所需要的版本的源码:官网源码下载地址 2、安装Homebrew: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ...

wf990051004 ⋅ 04/26 ⋅ 0

centos上安装ffmpeg

FFmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件)。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的...

水墨如丹青 ⋅ 04/13 ⋅ 0

CMake编译OpenCV中遇到的问题

0 有以下五个文件无法下载,导致编译失败 ffmpegversion.cmake opencvffmpeg.dll opencvffmpeg64.dll ippicv2017u2winintel6420170418.zip ippicv2017u2winia3220170418.zip 1 需要自己“合成......

chenxi1900 ⋅ 04/26 ⋅ 0

最新靠谱可用的 Mac 环境下 FFmpeg 环境搭建

大家好,我是光源。 最近在尝试搭建 FFmpeg 开发环境时遇到一个蛋疼的事,Google 了 N 篇文章竟然没有一篇是可以跑起来的! 少部分教程是给出了自我矛盾的配置(是的,按照贴出来的代码和配置...

光源_Android ⋅ 05/13 ⋅ 0

Mac brewinstall自动更新后,造成库之间依赖关系出错,如何还原到以前版本?

1、brew search ffmpeg 看看brew软件包管理器中有哪些版本? 一眼难以看出ffmpeg对应版本,可以结合ffmpeg官网或者是下载下来,再查看版本,这里我就直接告知ffmpeg有4.0和2.8的版本;或许你...

rouzhiwei3128 ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 9分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 20分钟前 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 37分钟前 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 45分钟前 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部