文档章节

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
粉丝 32
博文 562
码字总数 355267
作品 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
Firefox 43 Linux 发行版将默认采用 FFmpeg

绝大部分Linux发行版中都包含了FFmpeg,最近Mozilla也决定在Firefox中采用最新的FFmpeg包,这个决定应该也不会让人感觉到意外,虽然对Firefox而言这也是个比较重要的变化。FFmpeg是知名的多媒...

oschina
2015/11/17
3.1K
12
java在linux上调用ffmpeg命令行组合图片为视频时无法加入音频!

在window上本地测试时,音频时可以加入视频中的;当上载到Linux上后,居然加不进音频;用putty直接执行又没问题,不知何故?运行时代码: 命令行: ffmpeg/bin/ffmpeg -y -r 1.28 -f image2...

e国阳光
2016/10/15
568
3
Debian 决定从 Libav 切换到 FFmpeg

在将近一年的讨论之后,Linux发行版Debian正式决定从Libav 切换到 FFmpeg,最主要的理由是:FFmpeg在几乎所有方面都比libav好。Libav是FFmpeg的分支,是一群“心怀不满”的 FFmpeg开发者“起...

oschina
2015/07/09
4.2K
24
ffmpeg在windows下视频采集

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

WuHonghai
2011/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解Java PriorityQueue

ava中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对...

java菜分享
5分钟前
0
0
玩手机与做实验

看过这样一个故事:说的是在二十世纪二十年代初的一个深夜,担任英国剑桥大学卡文迪许实验室主任的卢瑟福来实验室检查,发现一位学生还在做实验。卢瑟福就问他:“你上午做什么了?”学生回答...

Bob2100
16分钟前
0
0
Kafka流式处理

Kafka Streams 初识流式处理 什么是数据流 数据流(也叫事件流)是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新记录会不断加...

东都大狼狗
25分钟前
2
0
Mysql主从复制(拓展博客文章扩充知识面)

#不停库不锁表在线主从配置 使用 Xtrabackup 在线对MySQL做主从复制 1.数据量大的话还是建议使用工具例如xtrabackup,mysqldump比较适合操作10G以下的数据备份复制。 2.做业务之前考虑清楚具...

robertt15
29分钟前
1
0
docker快速搭建几个常用的第三方服务

本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch; 如果想学习Java工程化、...

编程SHA
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部