精华内容
下载资源
问答
  • ffmpeg文件

    2014-01-17 10:45:43
    最新的ffmpeg开发库文件文件中包含了开发相关的资源文件,已经测试通过,
  • 自己ffmpeg文件,为了批量将文件夹内的视频文件截图而的,上传上来与大家分享。注需要配套ffmpeg.exe
  • ffmpeg MP4文件生成

    热门讨论 2012-08-05 22:15:00
    ffmpeg MP4文件生成的C代码,很详细的。但是首先要保证x264与ffmpeg已经集成了
  • ffmpeg实现文件的切割

    2018-02-13 10:43:39
    王纲老师的例子:ffmpeg实现文件的切割。还需进一步完善的是,播放显示的 总体时间还没变,切割的部分只是跳过去了。
  • ffmpeg写mp4文件时,关于h264的extradata

    千次阅读 2018-03-21 00:21:13
    extradata的解析在h264dec.c的ff_h264_decode_extradata函数中。extradata的生成在libx264.c的X...下面是我最开始的代码//视频流 AVCodec* codec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264); ...

    extradata的解析在h264dec.c的ff_h264_decode_extradata函数中。

    extradata的生成在libx264.c的X264_init函数中。

    下面是我最开始写的代码

    //视频流
                AVCodec* codec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264);
                ffmpeg_stream_video = ffmpeg.avformat_new_stream(m_ffmpeg_fct, codec);
                if (ffmpeg_stream_video == null)
                {
                    goto fail;
                }
                ffmpeg_stream_video->index = (int)m_ffmpeg_fct->nb_streams - 1;
                codec_context = ffmpeg_stream_video->codec;
                codec_context->codec_id = AVCodecID.AV_CODEC_ID_H264;
                codec_context->codec_type = AVMediaType.AVMEDIA_TYPE_VIDEO;
                codec_context->time_base.num = 1;
                codec_context->time_base.den = 12800;
                codec_context->pix_fmt = AVPixelFormat.AV_PIX_FMT_YUV420P;
                codec_context->width = video_width;
                codec_context->height = video_height;
    
                codec_context->flags |= ffmpeg.AV_CODEC_FLAG_GLOBAL_HEADER;
    
                ret = ffmpeg.avcodec_open2(codec_context, codec, null);

    上面代码的AV_CODEC_FLAG_GLOBAL_HEADER和avcodec_open2结合调用可以生成extradata,但这样做并不能正确播放。


    如上图,录像的sps和原始的不一致导致mp4不能正确播放。原因是没有设置libx264的编码参数导致生成的extradata不正确。不过要准确设置编码参数太麻烦,不如自己根据sps,pps生成extradata。

    查看最上面的2处源码可以知道sps,pps能直接copy给extradata。下面是代码实现,通过含sps,pps的I帧生成extradata。

    public unsafe class H264GenerateExtradata
    {
        public static byte[] H264GenerateExtradataFromIFrame(byte[] stream_h264)
        {
            int i;
            byte[] extradata = null, sps = null, pps = null;
    
            for(i = 0; i < 100; i++)
            {
                if (stream_h264[i] == 0x00 && stream_h264[i + 1] == 0x00 &&
                    stream_h264[i + 2] == 0x00 && stream_h264[i + 3] == 0x01)
                {
                    int nal_unit_type = stream_h264[i + 4] & 31;
                    //sps
                    if (nal_unit_type == 7)
                    {
                        //i += 4;
                        sps = FindNext0x00000001(stream_h264, ref i);
                        i--;
                        if (sps != null && pps != null)
                            break;
                    }
    
                    //pps
                    if (nal_unit_type == 8)
                    {
                        //i += 4;
                        pps = FindNext0x00000001(stream_h264, ref i);
                        i--;
                        if (sps != null && pps != null)
                            break;
                    }
                }
            }
    
            if (sps != null && pps != null)
            {
                extradata = new byte[sps.Length + pps.Length];
                Array.Copy(sps, 0, extradata, 0, sps.Length);
                Array.Copy(pps, 0, extradata, sps.Length, pps.Length);
    
                return extradata;
            }
    
            return null;
        }
    
        static byte[] FindNext0x00000001(byte[] stream_h264, ref int i)
        {
            int nal_start = i;
            i++;
            for (; i < 100; i++)
            {
                if (stream_h264[i] == 0x00 && stream_h264[i + 1] == 0x00 &&
                    stream_h264[i + 2] == 0x00 && stream_h264[i + 3] == 0x01)
                {
                    byte[] nal = new byte[i - nal_start];
                    Array.Copy(stream_h264, nal_start, nal, 0, i - nal_start);
                    return nal;
                }
            }
            return null;
        }
    }

    视频流初始化改为

    //视频流
                AVCodec* codec = ffmpeg.avcodec_find_encoder(AVCodecID.AV_CODEC_ID_H264);
                ffmpeg_stream_video = ffmpeg.avformat_new_stream(m_ffmpeg_fct, codec);
                if (ffmpeg_stream_video == null)
                {
                    goto fail;
                }
                ffmpeg_stream_video->index = (int)m_ffmpeg_fct->nb_streams - 1;
                codec_context = ffmpeg_stream_video->codec;
                codec_context->codec_id = AVCodecID.AV_CODEC_ID_H264;
                codec_context->codec_type = AVMediaType.AVMEDIA_TYPE_VIDEO;
                codec_context->time_base.num = 1;
                codec_context->time_base.den = 12800;
                codec_context->pix_fmt = AVPixelFormat.AV_PIX_FMT_YUV420P;
                codec_context->width = video_width;
                codec_context->height = video_height;
    
                //codec_context->flags |= ffmpeg.AV_CODEC_FLAG_GLOBAL_HEADER;
                if(extradata != null)
                {
                    codec_context->extradata = (byte*)ffmpeg.av_malloc((ulong)extradata.Length);
                    Marshal.Copy(extradata, 0, (IntPtr)codec_context->extradata, extradata.Length);
                    codec_context->extradata_size = extradata.Length;
                }
    
                ret = ffmpeg.avcodec_open2(codec_context, codec, null);

    展开全文
  • ffmpeg 合并文件 concat

    千次阅读 2018-01-16 15:06:40
    ffmpeg 合并文件 http://blog.csdn.net/u012587637/article/details/51670975

    ffmpeg 合并文件

    http://blog.csdn.net/u012587637/article/details/51670975

    展开全文
  • ffmpeg关于文件

    千次阅读 2015-07-22 18:21:14
    在做转码的时候遇到些问题 上述代码中codec_tag很重要 生成的转码后的预览图: 上面注释的可以用两种做判断,有些复用格式是需要全局头的。例如 mp4,flv,mov,3gp等格式。 特此记录一下: ...QQ:379969650

    在做转码的时候遇到些问题



    上述代码中codec_tag很重要

    生成的转码后的预览图:


    上面注释的可以用两种做判断,有些复用格式是需要全局头的。例如 mp4,flv,mov,3gp等格式。

    特此记录一下:

    交流请加QQ群:62054820
    QQ:379969650



    展开全文
  • 介绍使用ffmpeg合并视频文件你的具体办法,包括软件的安装、配置和使用例子。
  • FFmpeg任意文件读取漏洞分析

    千次阅读 2017-07-31 11:08:06
    漏洞简述: 漏洞利用了FFmpeg可以处理HLS播放列表的特性,而播放列表可以引用外部文件。通过在AVI文件中添加自定义的包含本地文件引用的HLS播放列表,可以触发该漏洞并在该文件播放过程中显示本地文件的内容 漏洞...

    这里写图片描述

    1. 漏洞描述

    • 漏洞简述: 漏洞利用了FFmpeg可以处理HLS播放列表的特性,而播放列表可以引用外部文件。通过在AVI文件中添加自定义的包含本地文件引用的HLS播放列表,可以触发该漏洞并在该文件播放过程中显示本地文件的内容
    • 漏洞发现者:Neex
    • 影响版本:FFmpeg < 3.3.2

    2. FFmpeg 背景知识简介

      FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。可以轻易地实现多种视频格式之间的相互转换,例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。其基本的工作流程是:

    原始的封装视频 –> demux 分离器对封装的视频资源进行分离 –> 得到音频资源和视频资源 –> 进行解码 –> 得到解压后的音频资源和视频资源 –> 进入 filter 进行编辑处理 –> 得到处理后的音频资源和视频资源 –> 对资源编码得到转码后的音频资源和视频资源 –> 进入 mux 混合器进行封装 –> 得到转码封装后的视频

    这里写图片描述

    3. HLS简介

    HLS (HTTP Live Streaming)

    常用的流媒体协议主要有 HTTP 渐进下载(HLS,flash 渐进式等)和基于 RTSP/RTP 的实时流媒体协议,这二种基本是完全不同的东西,目前比较方便又好用的是用 HTTP 渐进下载方法。

    在这个中 apple 公司的 HTTP Live Streaming 是这个方面的代表。它会把整个视频流分成多个小的,基于 HTTP 的文件来下载,每次下载一部分,并把视频流元数据存放于 m3u8 文件中。

    M3U8文件概念

    M3U8文件是指UTF-8编码格式的M3U文件。M3U文件是记录了一个索引纯文本文件,打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放。

    简单归纳起来就是:首先将一个完整视频分成多个TS视频文件,用户下载m3u8文件,通过m3u8文件的索引地址 播放具体的每个小段视频。

    这里写图片描述

    一个m3u8文件的基本格式如下:

        #EXTM3U
        #EXT-X-MEDIA-SEQUENCE:0
        #EXTINF:10.0,
        http://cdev.dx.su:1234/8.mp4   # 可以是远程资源
        #EXT-X-ENDLIST

    或者:

        #EXTM3U
        #EXT-X-MEDIA-SEQUENCE:0
        #EXTINF:10.0,
        test.ts   # 也可以是真正的视频资源
        #EXT-X-ENDLIST

    注释

        #EXTM3U:  每个M3U文件第一行必须是这个tag#EXTINF:指定每个媒体段(ts)的持续时间,这个仅对其后面的URI有效,每两个媒体段URI间被这个tag分隔开,其格式如下:
            #EXTINF:<duration>,<title>duration表示持续的时间(秒)”Durations MUST be integers if the protocol version of the Playlist file is less than 3“,否则可以是浮点数。
        #EXT-X-MEDIA-SEQUENCE:每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1#EXT-X-MEDIA-SEQUENCE:<number>:一个media URI并不是必须要包含的,如果没有,默认为0#EXT-X-ENDLIST:表示PlayList的末尾了,它可以在PlayList中任意位置出现,但是只能出现一个,格式如下:
            #EXT-X-ENDLIST

    4 漏洞分析

    该漏洞主要还是利用了去年的 CVE-2016-1897 和 CVE-2016-1898,一个 SSRF 和一个任意文件读取漏洞,其中 SSRF 用到的就是 m3u8 可以访问获取远程资源的特性。

    CVE-2016-1897

    这里写图片描述

    CVE-2016-1898

    因为FFmpeg扩展性极强,其中支持一个 Physical concatenation protocol concat: 可以把多个 url 流合并访问资源:

    concat:URL1|URL2|…|URLN

    结合 SSRF ,我们可以把 file:// 读到的内容发送出来。

        #EXTM3U
        #EXT-X-TARGETDURATION:6
        #EXTINF:10.0,
        concat:http://rr.sb/poc/header.m3u8|file:///tmp/vuln  
        #EXT-X-ENDLIST

    这里写图片描述

    之后官方在2.8.5版本修复了该漏洞。

    而这个漏洞则是绕过了这次修复,继续利用这两个漏洞达到任意文件读取。

    在上个月的 phdays conference 里,通过视频格式的一个 trick bypass 了厂商对 SSRF 的封堵。

    奇怪的视频格式标准

    在 AVI 视频中,有一个数据块可以定义字幕,叫做 GAB2 ,位置于 AVI header 中,有趣的是 m3u8 可以插入到 avi 文件中,且 FFmpeg 依旧会对有文件头 #EXTM3U 的 AVi 视频做 HLS 处理。

    利用思路如下: 将 m3u8 嵌入到带有 GAB2 的AVI视频中,对文件格式检查进行 bypass 。 因为之前说过,m3u8 并不是真正的视频资源,所以如果要播放,必须还要在 m3u8 中嵌入一个可播放的视频资源,其中有一个古老的媒体格式 XBin,这个媒体格式具备基本显示图片,文本的功能,体积非常小,最重要的是,这个媒体格式可编程,如果嵌入到 m3u8 中,将目标文件作为对象,用 xbin 绘制成为字符,就可以作为合法可播放的视频文件观看了,所以依次嵌套后,文件内容大致为:

        [AVI header]  
        [GAB2 header]  
        [m3u8 header]  
        [XBIN header]  
        目标文件  
        [XBIN footer]  
        [m3u8 footer]  
        [AVI footer]  

    但 FFmpeg 检查了 body 中的非法字符串,所以无法使用 data :对 XBIN 格式声明

        #EXTM3U
        #EXT-X-MEDIA-SEQUENCE:1
        #EXTINF:1.0,
        data:<format-header>  
        #EXTINF:1.0,
        file:///etc/passwd  
        #EXTINF:1.0,
        data:<format-footer>  
        #EXT-X-ENDLIST

    但是m3u8支持AES128的CBC模式加密,可以在#EXT-X-KEY中进行设置,所以可以很简单加密m3u8的内容:

    …
        #EXTINF:1,
        #EXT-X-KEY:METHOD=AES-128, URI=/dev/zero, IV=<VAL>
        #EXT-X-BYTERANGE: 16
        /dev/zero
        …
        = AES^-1 CONST(0x00…00) ⊕<VAL> = <FMT HEADER>

    由于m3u8单次访问目标文件获取到的内容不完整,为了获得完整的文件内容,还需要控制#EXT-X-BYTERANGE设置偏移量,然后重复这一部分

    最终,我们得到的文件应该是这样的:

        [AVI header]
        [GAB2 header]
        [m3u8 header]
        {loop}
        #EXT-X-KEY:METHOD=AES-128, URI=/dev/zero, IV=<VAL>     #声明m3u8AES加密,将XBIN部分加密
        [XBIN header]     #被加密
        目标文件
        [XBIN footer]    #被加密
        {loop}
        [m3u8 footer]
        [AVI footer]

    利用github上的Python POC脚本生成含有SSRF攻击的avi格式视频。脚本使用方法:

    这里写图片描述

    通过命令行查看生成的avi视频源码:

    这里写图片描述

    通过notepad++ 查看视频文件源码:

    这里写图片描述

    1. 可以看到和上述的命令行查看是一样的,AVI header以及GAB2 包含不可打印字符这里就不做解释了,我们可以看到### echoing b'XBIN\x1a \x00\x0f\x00\x10\x04\x01\x00\x00\x00\x00' 为XBIN header。
    2. #EXT-X-KEY: METHOD=AES-128, URI=/dev/zero, IV=0x4c4d465e0b95223279487316ffd9ec3a
            #EXT-X-KEY:表示怎么对media segments进行解码。其作用范围是下次该tag出现前的所有media URI,格式如下:
                 #EXT-X-KEY:<attribute-list>NONE 或者 AES-128。如果是NONE,则URI以及IV属性必须不存在,如果是AES-128(Advanced Encryption Standard),则URI必须存在,IV可以不存在。
                对于AES-128的情况,keytag和URI属性共同表示了一个key文件,通过URI可以获得这个key,如果没有
                IV(Initialization Vector),则使用序列号作为IV进行编解码,将序列号的高位赋到16个字节的buffer中,左边补0;如果
                有IV,则将改值当成16个字节的16进制数。

    3 . #EXT-X-BYTERANGE: 64@0
    #EXT-X-BYTERANGE控制文件的偏移地址,并在随后的空行中指定文件的URI地址。通过不断递增文件的偏移地址,该文件可以实现对本地文件的遍历显示播放。

    通过命令ffplay exp.avi直接读取生成的avi文件,可以看到文件内容成功显示到ffplay视频播放器中:

    这里写图片描述

    5. 漏洞复现(远程文件读取)

    1.首先自己搭建一个可以上传视频以及播放视频的页面。

    这里写图片描述

    2.利用上文中POC生成avi视频文件:./gen_xbin_avi.py file:///etc/passwd exp.avi

    3.将视频文件通过网页上传到服务器中,点击播放:

    这里写图片描述

    可以看到成功显示了/etc/passwd内容。

    6. 修复方案

    根据官方升级版本进行源码diff:

    这里写图片描述

    这里写图片描述

    我们可以看到最主要的修复方式是在hls.c文件中,

        +    {"allowed_extensions", "List of file extensions that hls is allowed to access",
        +        OFFSET(allowed_extensions), AV_OPT_TYPE_STRING,
        +        {.str = "3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav"},
        +        INT_MIN, INT_MAX, FLAGS},

    采用白名单机制,限制后缀名只能是上述的那些才能执行。

    7. 参考资料

    展开全文
  • 最新打包的ffmpeg 2.0 版本,放心使用!
  • 编译好的ffmpeg类库文件,32位版本,输出版本号为 ffmpeg version N-99305-gbc0e776 Copyright (c) 2000-2020 the FFmpeg developers built with 用于 x86 的 Microsoft (R) C/C++ 优化编译器 19.27.29112 版 包含...
  • 使用ffmpeg转换flac文件为mp3,重命名中文文件后使用ffmpeg保持高保真比率转换flac文件
  • ffmpeg的so文件

    2017-11-09 11:59:50
    ffmpeg的.so文件,如何编译请参考http://www.jianshu.com/p/ca7ffd2e5e68
  • ffmpeg合并视频文件

    千次阅读 2019-04-28 23:28:02
    ffmpeg合并视频文件 创建列表文件filelist.txt,将需要合并的文件按顺序加入,内容如下所示: ffconcat version 1.0 file path/test_1.mp4 file path/test_2.mp4 file path/test_3.mp4 file path/test_4.mp4 file ...
  • FFmpeg中可执行文件ffmpeg用法汇总

    千次阅读 2019-08-18 19:21:02
    从https://ffbinaries.com/downloads 下载最新的4.1版本的Windows 64位...通过执行以下命令将FFmpeg信息重定位到ffmpeg_help.txt文件中便于查看,其内容如下,FFmpeg使用方法为:ffmpeg.exe [options] [[infile...
  • ffmpeg——av_write_trailer写文件

    千次阅读 2016-10-21 17:16:31
     avformat_write_header : 写文件头  av_write_frame/av_interleaved_write_frame: packet  av_write_trailer : 写文件尾 本文主要分析 av_write_trailer 。 int av_write_trailer(AV
  • 使用ffmpeg将YUV文件编码到常见视频文件格式,这些视频文件可以用来作为视频编解码测试文件
  • FFmpeg delphi库文件

    2012-04-27 09:52:38
    FFmpeg的C++头文件转成了delphi的pas文件
  • ffmpeg文件生成m3u8文件及ts切片程序_1

    热门讨论 2016-03-09 17:08:57
    ffmpeg文件生成m3u8文件及ts切片程序_1,实现输入本地文件切片成ts文件,m3u8,demo级别
  • ffmpeg文件生成m3u8文件及ts切片程序+ffmpeg切割TS带加密
  • FFMPEG 音频转PCM文件

    2017-08-01 15:12:02
    FFMPEG 音频转PCM文件
  • vs2008编译 ffmpeg Static dll 完整库文件 下载 本人亲测,在vs2008 环境下 vc++ 完美演绎 https://download.csdn.net/download/tytok/10563428 #include &lt;libavcodec/avcodec.h&gt; #include &lt;...
  • ffmpeg文件的重命名和删除操作

    千次阅读 2018-11-30 21:27:17
    # include # include "libavformat/avformat.h" ...//文件重命名 ..."rename file is failed....gcc -g -o file testfile.c -I …/ffmpeg -L …/ffmpeg/libavutil -lavutil -L …/ffmpeg/libavformat -lavformat。
  • FFMPEG+SDL最新库文件和源文件

    热门讨论 2011-10-31 21:06:34
    FFMPEG+SDL最新库文件和源文件 FFMPEG+SDL最新库文件和源文件 FFMPEG+SDL最新库文件和源文件
  • android版ffmpeg调用so文件及对应头文件 ffmpeg版本为2.6.2 android版ffmpeg调用so文件及对应头文件 ffmpeg版本为2.6.2 android版ffmpeg调用so文件及对应头文件 ffmpeg版本为2.6.2 android版ffmpeg调用so文件及对应...
  • ffmpeg读取文件速度的控制

    千次阅读 2017-05-09 14:25:14
    (2)根据读取的AVpacket的pts控制速度,核心思想:将ffmpeg的pts转换成系统时间,然后比较当前时间和读取的pts时间,差值即为控制的因素 1、获取启动时间,start_time = av_gettime(); 2、转换avpacket的pts ...
  • nginx、ffmpeg转流文件源码。多个同时转流。详情看代码 nginx、ffmpeg转流文件源码。多个同时转流。详情看代码 nginx、ffmpeg转流文件源码。多个同时转流。详情看代码 nginx、ffmpeg转流文件源码。多个同时转流。...
  • ffmpeg切割音频文件

    千次阅读 2019-12-13 16:42:08
    ffmpeg -i source.mp3 -vn -acodec copy -ss 00:03:21.36 -t 00:00:41 output.mp3 // -ss 从 小时:分:秒 处开始切割 // -t 持续时间 //-to 到小时:分:秒.毫秒 处截止 ...
  • ffmpeg文件无法下载

    千次阅读 2017-03-29 22:42:32
    ffmpeg文件无法下载 CMake错误 CMake Warning at cmake/OpenCVUtils.cmake:872 (message): Download: Local copy of opencv_ffmpeg.dll has invalid MD5 hash: 3a56b0b26c0d56457a990eb00d87f889 (expected: ...
  • ffmpeg 将swf文件转 mp4

    千次阅读 2021-01-01 14:57:01
    使用ffmpeg将swf文件转换为mp4文件 ffmpeg -i files.swf video.mp4 也可以直接通过swf链接转换为mp4 ffmpeg -i http://www.cn0-6.com/upload/2012/7/2012710101615469.swf video.mp4 以上是 使用ffmpeg将swf文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,590
精华内容 25,836
关键字:

ffmpeg写文件