文档章节

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
博文 587
码字总数 388789
作品 0
榆林
私信 提问
FFMPEG系列二:linux下下载编译安装ffmpeg(超详细附采坑完整版)

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

陈守印
2018/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
ffmpeg在windows下视频采集

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

WuHonghai
2011/11/18
0
0
Debian 决定从 Libav 切换到 FFmpeg

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

oschina
2015/07/09
4.2K
24

没有更多内容

加载失败,请刷新页面

加载更多

web前端性能优化

js相关 根据js时间线,将js放在最下面加载,先加载DOM,再加载js 懒执行,就是将某些逻辑延迟到使用时再执行。该技术可用于首屏优化,对于某些耗时逻辑并不需要在首屏就使用的,就可以使用懒...

祖达
16分钟前
0
0
websocket通信failed to execute 'send'问题的解决

在建立web socket通信后,发送数据时,出现下图所示现象: 问题代码演示 function TestSockets() { //实例化一个WebSocket对象 var socket = new WebSocket("ws://127.0.0.1:8000/w...

城市之雾
21分钟前
0
0
PHPStorm 如何设置 yaf 代码提示?

下载 php-yaf-doc git clone https://github.com/elad-yosifon/php-yaf-doc.git PHPStorm 如下设置 使用

whoru
23分钟前
0
0
typeorm drop foreign key

1. 问题描述 项目代码中使用typeorm进行mysql的数据操作, 昨天突然部署测试环境发现测试环境数据库的外键都为空了, 导致涉及的整个系统不可用. 2. 问题探究 尝试复现 mysqldump 线上数据, 然...

jimmywa
24分钟前
2
0
好程序员web前端开发测验之css部分

好程序员web前端开发测验之css部分Front End Web Development Quiz CSS 部分问题与解答 Q: CSS 属性是否区分大小写? <p><font size="3">  ul {</font></p> <p><font size="3">  MaRGin:......

好程序员IT
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部