精华内容
下载资源
问答
  • ffMPEG 手册
    2014-08-06 16:47:08
    FFMpeg SDK 开发手册
    FFMpeg 中比较重要的函数以及数据结构如下:
    1. 数据结构:
    (1) AVFormatContext
    (2) AVOutputFormat
    (3) AVInputFormat
    (4) AVCodecContext
    (5) AVCodec
    (6) AVFrame
    (7) AVPacket
    (8) AVPicture
    (9) AVStream
    2. 初始化函数:
    (1) av_register_all()
    (2) avcodec_open()
    (3) avcodec_close()
    (4) av_open_input_file()
    (5) av_find_input_format()
    (6) av_find_stream_info()
    (7) av_close_input_file()
    3. 音视频编解码函数:
    (1) avcodec_find_decoder()
    (2) avcodec_alloc_frame()
    (3) avpicture_get_size()
    (4) avpicture_fill()
    (5) img_convert()
    (6) avcodec_alloc_context()
    (7) avcodec_decode_video()
    (8) av_free_packet()
    (9) av_free()
    4. 文件操作:
    (1) avnew_steam()
    (2) av_read_frame()
    (3) av_write_frame()
    (4) dump_format()
    5. 其他函数:
    (1) avpicture_deinterlace()
    (2) ImgReSampleContext()
    以下就根据,以上数据结构及函数在ffmpeg测试代码output_example.c中出现的前后顺进行分析。在此之前还是先谈一下ffmpeg的编译问题。在linux下的编译比较简单,这里不多说了。在windows下的编译可以参考以下网页:
    http://bbs.chinavideo.org/viewthread.php?tid=1897&extra=page%3D1
    值得一提的是,在使用编译后的sdk进行测试时(用到ffmpeg目录下的output_example.c)编译过程中可能会有以下两个问题:
    1. Output_example.c用到了snprintf.h这个头文件。然而这个头文件在win下和linux下有所不同。具体在win下可以用以下方法解决:
    http://www.ijs.si/software/snprintf/
    2. 如果使用vc6,或是vc6的命令行进行编译,inline可能不认。错误会出现在common.h文件中,可以在common.h中加入
    #ifdef _MSC_VAR
    #define inline __inline
    #endif
    交待完毕进入正题。
    一.FFMpeg 中的数据结构:
    I. AVFormatContext
    一般在使用ffmpeg sdk的代码中AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。FFmpeg代码中对这个数据结构的注释是:format I/O context
    此结构包含了一个视频流的格式内容。其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright等。还有一些可能在编解码中会用到的信息,诸如:duration, file_size, bit_rate等。参考avformat.h头文件。
    Useage:
    声明:
    AVFormatContext *oc; (1)
    初始化: 由于AVFormatConext结构包含许多信息因此初始化过程是分步完成,而且有些变量如果没有值可用,也可不初始化。但是由于一般声明都是用指针因此一个分配内存过程不可少:
    oc = av_alloc_format_context(); (2)
    结构中的AVInputFormat*(或AVOutputFormat*)是一定要初始化的,基本上这是编译码要使用什么codec的依据所在:
    oc->oformat = fmt; or oc->iformat = fmt; (3)
    其中AVOutputFormat* fmt或AVInputFormat* fmt。(AVInputFormat and AVOutputFormat的初始化在后面介绍。随后在参考代码output_example.c中有一行:
    snprintf(oc-filename, sizeof(oc->filename), “%s”, filename); (4)
    还不是十分清楚有什么作用,估计是先要在输出文件中写一些头信息。
    在完成以上步骤后,(初始化完毕AVInputFormat*(或AVOutputFormat*)以及AVFormatContext)接下来就是要利用oc初始化本节开始讲到的AVFormatContext中的第二个重要结构。AVStream(假设已经有了声明AVStream *video_st。参考代码中用了一个函数来完成初始化,当然也可以在主函数中做,传递进函数的参数是oc 和fmt->video_codec(这个在下一节介绍(29)):
    vdeo_st = add_video_stream(oc, fmt->video_codec); (5)
    此函数会在后面讲到AVStream结构时分析。
    AVFormatContext最后的一个设置工作是:
    if( av_set_paramters(oc,NULL) b_streams; i++){
    av_freep(&oc->streams->codec); (13)
    av_freep(&oc->streams); (14)
    }
    //close the ouput file
    if(!(fmt->flags & AVFMT_NOFILE)){
    url_fclose(&oc->pb); (15)
    }
    av_free(oc); (16)
    通过以上的一串代码,就可以清晰地看出AVFormatContex* oc和AVStream* video_st是在使用ffmpeg SDK开发时贯穿始终的两个数据结构。以下,简要介绍一下三个标为红色的函数,他们是参考代码output_example.c开发者自行定义的函数。这样可以使整个代码结构清晰,当然你在使用ffmpeg SDK时也可以在主函数中完成对应的功能。在后面我们会专门针对这三个函数做分析。
    1. open_video(oc, video_st);
    此函数主要是对视频编码器(或解码器)的初始化过程。初始化的数据结构为AVCodec* codec和AVCodecContext* c包括用到了的SDK函数有:
    c = st->codec;
    codec = avcodec_find_encoder(c->codec_id); //编码时,找编码器 (17)
    codec = avcodec_find_decoder(c->codec_id); //解码时,找解码器 (18)
    AVCodecContex是结构AVStream中的一个数据结构,因此在AVStream初始化后(5)直接复值给c。
    // internal open video codec
    avcodec_open(c,codec); (19)
    // allocate video stream buffer
    // AVFrame *picture
    // uint8_t *video_outbuf
    video_outbuf_size=200000;
    video_outbuf = av_maloc(video_outbuf_size); (20)
    // allocate video frame buffer
    picture = alloc_picture(c->pix_fmt, c->width, c->height); (21)
    上述三步比较容易理解,打开视频编解码codec、分配输出流缓存大小、分配每一帧图像缓存大小。其中AVFrame也是ffmpeg中主要数据结构之一。这一步(8)是对编解码器的初始化过程。
    2. write_video_frame(AVFormatContext *oc, AVStream *st)
    这个函数中做了真正的编解码工作,其中的函数比较复杂先列出来慢慢分析。
    用到的数据结构有AVCodecContext *c, SwsContext *img_convert_ctx。其中SwsContext是用来变换图像格式的。比如yuv422变到yuv420等,当然也用到函数,见下面列表。
    fill_yuv_image(tmp_picture, frame_count, c->width, c->height); (22)
    sws_scale(img_convert_ctx, tmp_picture->, tmp_picture->linesize,
    0, c->height, picture->data, picture->linesize); (23)
    img_convert_ctx = sws_getContxt(c->width, c->height, PIX_FMT_YUV420P, (24)
    c->width, c->heigth, c->pix_fmt, sws_flags, NULL, NULL, NULL);
    由于参考代码中做的是一个编码。因此,它总是要求编码器输入的是yuv文件,而且是yuv420格式的。就会有了以上一些处理过程。接下来调用编码器编码,数据规则化(打包)用到AVPacket,这也是ffmpeg中一个比较不好理解的地方。
    out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture); (25)
    AVPacket pkt;
    av_init_packet(&pkt); (26)
    //……handle pkt process, we will analyze later
    ret = av_write_frame(oc, &pkt); (27)
    有encode就一定会有decode。而且ffmpeg专为解码而生,但是为什么在参考代码中只用了encoder呢?个人猜想是因为encode只是用yuv420来编码,这样的yuv420生成比较容易,要是用到解码的化,还要在代码中附带一个其他格式的音视频文件。在源代码libavcodec文件夹中有一个apiexample.c的参考代码,其中就做了编解码。有空的化我会分析一下。
    3. close_video(AVFormatContext *oc, AVStream *st)
    avcodec_close(st->codec);
    av_free(picture->data[0]);
    av_free(picture);
    av_free(video_outbuf);
    比较容易理解,不多说了。
    以上一大段虽然名为介绍AVFormatContext。但基本上把ouput_example.c的视频编码部分的框架走了一遍,其一是想说明结构AVFormatContext的重要性,另一方面也是希望对使用FFMpeg SDK开发者有一个大致的框架。
    其实,真正的一些编码函数,内存分配函数在SDK中都已经封装好了,只要搞清楚结构就能用了。而开发者要做的就是一些初始化的过程,基本上就是针对数据结构1的初始化。
    II. AVOutputFormat
    虽然简单(初始化)但是十分重要,他是编解码器将要使用哪个codec的“指示”。在其成员数据中最重要的就是关于视频codec的了:enum CodecID video_codec;
    AVOutputFormat *fmt;
    fmt = guess_format(NULL, filename, NULL); (28)
    根据filename来判断文件格式,同时也初始化了用什么编码器。当然,如果是用AVInputFormat *fmt的化,就是fix用什么解码器。(指定输出序列->fix编码器,指定输入序列->fix解码器?)
    III. AVStream
    AVStream作为继AVFormatContext后第二个贯穿始终的结构是有其理由的。他的成员数据中有AVCodecContext这基本的上是对所使用的Video Codec的参数进行设定的(包括bit rate、分辨率等重要信息)。同时作为“Stream”,它包含了“流”这个概念中的一些数据,比如:帧率(r_frame_rate)、基本时间计量单位(time_base)、(需要编解码的)首帧位置(start_time)、持续时间(duration)、帧数(nb_frames)以及一些ip信息。当然后面的这些信息中有些不是必须要初始化的,但是AVCodecContex是一定要初始化的,而且就是作为初始化AVStream最重要的一个部分。我们在前面就谈到了AVStream的初始化函数(5),现在来看看他是怎么做的:
    // declaration
    AVStream *video_st;
    video_st = add_video_stream(oc, fmt->video_codec);
    static AVStream *add_video_stream(AVFormatContex *oc, int codec_id){ (29)
    AVCodecContext *c; // member of AVStream, which will be initialized here
    AVStream *st; // temporary data, will be returned
    st = av_new_stream(oc, 0); (30)
    c = st->codec;
    // 以下基本是针对c的初始化过程。包括比特率、分辨率、GOP大小等。
    ……
    // 以下的两行需要注意一下,特别是使用MP4的
    if(!strcmp(oc->oformat->name, “mp4”) || !strcmp(oc->oformat->name, “mov”) || !strcmp(oc->oformat->name, “3gp”))
    c->flags |= CODEC_FLAG_GLOBAL_HEADER;
    // 将st传给video_st;
    return st;
    }
    以上代码中,有几点需要注意的。一个是(30)和c = st->codec是一定要做的,当然这是编程中最基本的问题,(30)是将st这个AVSteam绑定到AVFormatContext* oc上。后面的c = st->codec是将c绑定到st的AVCodecContext上。其二是对c的初始化过程中,ouput_example.c里做的是一些基本的配置,当然作为使用者的你还希望对codec加入其他的一些编解码的条件。可以参考avcodec.h里关于AVCodecContext结构的介绍,注释比较详细的。
    关于AVStream的使用在前面介绍AVFormatContext时已有所涉及,在主函数中三个编解码函数中(8)、(10)和(11)中。观察相关的代码,可以发现主要还是将AVStream中的AVCodecContext提取出来,再从中提取出AVCodec结构如在(8)中:
    // open_video(oc, video_st);
    // AVFormatContext *oc, AVStream *st
    AVCodec *codec;
    AVCodecContext *c;
    c = st->codec;
    codec = avcodec_find_encoder(c->codec_id); (31)
    // open the codec
    avcodec_open(c, codec); (32)
    同样,我们可以看到在(10)(write_video_frame())中AVFrame也是做为传递AVCodecContext结构的载体而存在。(11)(close_video())比较简单,不熬述。
    IV. AVCodecContext
    此结构在Ffmpeg SDK中的注释是:main external api structure其重要性可见一斑。而且在avcodec它的定义处,对其每个成员变量,都给出了十分详细的介绍。应该说AVCodecContext的初始化是Codec使用中最重要的一环。虽然在前面的AVStream中已经有所提及,但是这里还是要在说一遍。AVCodecContext作为Avstream的一个成员结构,必须要在Avstream初始化后(30)再对其初始化(AVStream的初始化用到AVFormatContex)。虽然成员变量比较多,但是这里只说一下在output_example.c中用到了,其他的请查阅avcodec.h文件中介绍。
    // static AVStream *add_video_stream(AVFormatContext *oc, int codec_id)
    AVCodecContext *c;
    st = av_new_stream(oc, 0);
    c = st->codec;
    c->codec_id = codec_id;
    c->codec_type = CODEC_TYPE_VIDEO;
    c->bit_rate = 400000; // 400 kbits/s
    c->width = 352;
    c->height = 288; // CIF
    // 帧率做分母,秒做分子,那么time_base也就是一帧所用时间。(时间基!)
    c->time_base.den = STREAM_FRAME_RATE;
    c->time_base.num = 1;
    c->gop_size =12;
    // here define:
    // #define STREAM_PIX_FMT PIX_FMT_YUV420P
    // pixel format, see PIX_FMT_xxx
    // -encoding: set by user.
    // -decoding: set by lavc.
    c->pix_fmt = STREAM_PIX_FMT;
    除了以上列出了的。还有诸如指定运动估计算法的: me_method。量化参数、最大b帧数:max_b_frames。码率控制的参数、差错掩盖error_concealment、模式判断模式:mb_decision (这个参数蛮有意思的,可以看看avcodec.h 1566行)、Lagrange multipler参数:lmin & lmax 和 宏块级Lagrange multipler参数:mb_lmin & mb_lmax、constant quantization parameter rate control method: cqp等。
    值得一提的是在AVCodecContext中有两个成员数据结构:AVCodec、AVFrame。AVCodec记录了所要使用的Codec信息并且含有5个函数:init、encoder、close、decode、flush来完成编解码工作(参见avcode.h 2072行)。AVFrame中主要是包含了编码后的帧信息,包括本帧是否是key frame、*data[4]定义的Y、Cb和Cr信息等,随后详细介绍。
    初始化后,可以说AVCodecContext在(8)&(10)中大显身手。先在(8)open_video()中初始化AVCodec *codec以及AVFrame* picture:
    // AVCodecContext *c;
    codec = avcodec_find_encoder(c->codec_id);
    ……
    picture = alloc_picture(PIX_FMT_YUV420P, c->width, c->height);
    后在writer_video_frame(AVFormatContext *oc, AVStream *st)中作为一个编解码器的主要参数被利用:
    AVCodecContext *c;
    c = st->codec;
    ……
    out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture);
    V.AVCodec
    结构AVCodec中成员变量和成员函数比较少,但是很重要。他包含了CodecID,也就是用哪个Codec、
    像素格式信息。还有前面提到过的5个函数(init、encode、close、decoder、flush)。顺便提一下,虽然在参考代码output_example.c中的编码函数用的是avcodec_encode_video(),我怀疑在其中就是调用了AVCodec的encode函数,他们传递的参数和返回值都是一致的,当然还没有得到确认,有兴趣可以看看ffmpeg源代码。在参考代码中,AVCodec的初始化后的使用都是依附于AVCodecContex,前者是后者的成员。在AVCodecContext初始化后(add_video_stream()),AVCodec也就能很好的初始化了:
    //初始化
    codec = avcodec_find_encoder(c->codec_id); (33)
    //打开Codec
    avcodec_open(c, codec) (34)
    VI. AVFrame
    AVFrame是个很有意思的结构,它本身是这样定义的:
    typedef struct AVFrame {
    FF_COMMON_FRAME
    }AVFrame;
    其中,FF_COMMON_FRAME是以一个宏出现的。由于在编解码过程中AVFrame中的数据是要经常存取的。为了加速,要采取这样的代码手段。
    AVFrame是作为一个描述“原始图像”(也就是YUV或是RGB…还有其他的吗?)的结构,他的头两个成员数据,uint8_t *data[4],int linesize[4],第一个存放的是Y、Cb、Cr(yuv格式),linesize是啥?由这两个数据还能提取处另外一个数据结构:
    typedef struct AVPicture {
    uint8_t *data[4];
    int linesize[4]; // number of bytes per line
    }AVPicture ;
    此外,AVFrame还含有其他一些成员数据,比如。是否key_frame、已编码图像书coded_picture_number、是否作为参考帧reference、宏块类型 *mb_type等等(avcodec.h 446行)。
    AVFrame的初始化并没有他结构上看上去的那么简单。由于AVFrame还有一个承载图像数据的任务(data[4])因此,对他分配内存应该要小心完成。output_example.c中提供了alloc_picute()来完成这项工作。参考代码中定义了两个全局变量:AVFrame *picture,*tmp_picture。(如果使用yuv420格式的那么只用到前一个数据picture就行了,将图像信息放入picture中。如果是其他格式,那么先要将yuv420格式初始化后放到tmp_picture中在转到需求格式放入picture中。)在open_video()打开编解码器后初始化AVFrame:
    picture = alloc_picture(c->pix_fmt, c->width, c->height);
    tmp_picture = alloc_picture(PIX_FMT_YUV420P, c->width, c->height);
    static AVFrame *alloc_picture(int pix_fmt, int width, int height){
    AVFrame *picture;
    uint8_t *picture_buf; // think about why use uint8_t? a byte!
    picture = avcodec_alloc_frame(); (35)
    if(!picture)
    return NULL;
    size = avpicture_get_size(pix_fmt, width, height); (36)
    picture_buf = av_malloc(size); (37)
    if(!picture_buf){
    av_free(picture); (38)
    return NULL;
    }
    avpicture_fill ( (AVPicture *)picture, picture_buf, pix_fmt, width, height); (39)
    return picture;
    }
    从以上代码可以看出,完成对一个AVFrame的初始化(其实也就是内存分配),基本上是有这样一个固定模式的。至于(35)(39)分别完成了那些工作,以及为什么有这样两步,还没有搞清楚,需要看原代码。我的猜测是(35)对AVFrame做了基本的内存分配,保留了对可以提取出AVPicture的前两个数据的内存分配到(39)来完成。
    说到这里,我们观察到在(39)中有一个(AVPicture *)picture,AVPicture这个结构也很有用。基本上他的大小也就是要在网络上传输的包大小,我们在后面可以看到AVPacket跟AVPicture有密切的关系。
    VII.AVPicture
    AVPicture在参考代码中没有自己本身的申明和初始化过程。出现了的两次都是作为强制类型转换由AVFrame中提取出来的:
    // open_video() 中
    avpicture_fill((AVPicture *)picture, picture_buf, pix_fmt, width, height); (40)
    //write_video_frame 中
    // AVPacket pkt;
    if(oc->oformat->flags & AVFMT_RAWPICTURE){
    ……
    pkt.size = sizeof(AVPicture); (41)
    }
    在(40)中,实际上是对AVFrame的data[4]、linesize[4]分配内存。由于这两个数据大小如何分配确实需要有pix_fmt、width、height来确定。如果输出文件格式就是RAW 图片(如YUV和RGB),AVPacket作为将编码后数据写入文件的基本数据单元,他的单元大小、数据都是由AVPacket来的。
    总结起来就是,AVPicture的存在有以下原因,AVPicture将Picture的概念从Frame中提取出来,就只由Picture(图片)本身的信息,亮度、色度和行大小。而Frame还有如是否是key frame之类的信息。这样的类似“分级”是整个概念更加清晰。
    VIII.AVPacket
    AVPacket的存在是作为写入文件的基本单元而存在的。我们可能会认为直接把编码后的比特流写入文件不就可以了,为什么还要麻烦设置一个AVPacket结构。在我看来这样的编码设置是十分有必要的,特别是在做视频实时传输,同步、边界问题可以通过AVPacket来解决。AVPacket的成员数据有两个时间戳、数据data(通常是编码后数据)、大小size等等(参见avformat.h 48行)。讲AVPacket的用法就不得不提到编解码函数,因为AVPacket的好些信息只有在编解码后才能的知。在参考代码中(ouput_example.c 从362到394行),做的一个判断分支。如果输出文件格式是RAW图像(即YUV或RGB)那么就没有编码函数,直接写入文件(因为程序本身生成一个YUV文件),这里的代码虽然在此看来没什么价值,但是如果是解码函数解出yuv文件(或rgb)那么基本的写文件操作就是这样的:
    if(oc->oformat->flags & AVFMT_RAWPICTURE) {
    AVPacket pkt; // 这里没有用指针!
    av_init_packet(&pkt);
    pkt.flags |= PKT_FLAG_KEY // raw picture 中,每帧都是key frame?
    pkt.stream_index = st->index;
    pkt.data = (uint8_t *)picture;
    pkt.size = sizeof(AVPicture);
    ret = av_write_frame(oc, &pkt);
    }
    输出非raw picture,编码后:
    else{
    // video_outbuf & video_outbuf_size在open_video() 中初始化
    out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture); (42)
    if(out_size > 0){
    AVPacket pkt;
    av_init_packet(&pkt); (43)
    pkt.pts= av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base); (44)
    if(c->coded_frame->key_frame)
    pkt.flags |= PKT_FLAG_KEY;
    pkt.stream_index= st->index;
    pkt.data= video_outbuf;
    pkt.size= out_size;
    /* write the compressed frame in the media file */
    ret = av_write_frame(oc, &pkt); (45)
    } else {
    ret = 0;
    }
    if (ret != 0) {
    fprintf(stderr, "Error while writing video frame/n");
    exit(1);
    }
    其中video_outbuf和video_outbuf_size在open_video()里的初始化是这样的:
    video_outbuf = NULL;
    // 输出不是raw picture,而确实用到编码codec
    if( !(oc->oformat->flags & AVFMT_RAWPICTURE)){
    video_outbuf_size = 200000;
    video_outbuf = av_malloc(video_outbuf_size);
    }
    (43)是AVPacket结构的初始化函数。(44)比较难理解,而且为什么会有这样的一些时间戳我也没有搞明白。其他的AVPacket成员数据的赋值比较容易理解,要注意的是video_outbuf和video_outbuf_size的初始化问题,由于在参考代码中初始化和使用不在同一函数中,所以比较容易忽视。(45)是写文件函数,AVFormatContext* oc中含有文件名等信息,返回值ret因该是一共写了多少数据信息,如果返回0则说明写失败。(42)和(45)作为比较重要的SDK函数,后面还会介绍的。.
    IX. Conclusion
    以上分析了FFMpeg中比较重要的数据结构。下面的这个生成关系理一下思路:(->表示 派生出)
    AVFormatContext->AVStream->AVCodecContext->AVCodec
    |
    AVOutputFormat or AVInputFormat
    AVFrame->AVPicture….>AVPacket
    二.FFMpeg 中的函数:
    在前一部分的分析中我们已经看到FFMpeg SDK提供了许多初始化函数和编码函数。我们要做的就是对主要数据结构正确的初始化,以及正确使用相应的编解码函数以及读写(I/O)操作函数。作为一个整体化的代码SDK,FFMpeg有一些他自己的标准化使用过程。比如函数av_register_all(); 就是一个最开始就该调用的“注册函数”,他初始化了libavcodec,“注册”了所有的的codec和视频文件格式(format)。下面,我沿着参考代码(ouput_example.c)的脉络,介绍一下相关函数。
    /******************************************************************
    main()
    ******************************************************************/
    1. av_register_all ();
    usage: initialize ibavcoded, and register all codecs and formats
    每个使用FFMpeg SDK的工程都必须调用的函数。进行codec和format的注册,然后才能使用。声明在allformats.c中,都是宏有兴趣看看。
    2. AVOutputFormat guess_format(const char *short_name, const char *filename, const char *mime_type)
    usage: 通过文件后缀名,猜测文件格式,其实也就是要判断使用什么编码器(or解码器)。
    AVOutputFormat *fmt;
    fmt = guess_format(NULL, filename, NULL);
    3. AVFormatContext *av_alloc_format_context(void)
    usage: allocate the output media context.实际是初始化AVFormatContext的成员数据AVClass:
    AVFormatContext *ic;
    ic->av_class = &av_format_context_class;
    //where
    // format_to_name, options are pointer to function
    static const AVClass av_format_context_class = {“AVFormatContext”, format_to_name, options};
    4. static AVStream *add_video_stream(AVFormatContext *ox, int codec_id);
    AVStream *video_st;
    video_st = add_video_stream(oc, fmt->video_codec);
    5. int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
    usage: set the output parameters (must be done even if no parameters).
    AVFormatContext *oc;
    // if failed, return integer smaller than zero
    av_set_parameters(oc, NULL);
    6. void dump_format(AVFormatContext *ic, int index, const char *url, int is_output);
    usage: 这一步会用有效的信息把 AVFormatContext 的流域(streams field)填满。作为一个可调试的诊断,我们会将这些信息全盘输出到标准错误输出中,不过你在一个应用程序的产品中并不用这么做:
    dump_format(oc, 0, filename, 1); // 也就是指明AVFormatContext中的事AVOutputFormat,还是 // AVInputFormat
    7. static void open_video(AVFormatContext *oc, AVStream *st)
    open_video(oc, video_st);
    8. int av_write_header(AVFormatContext *s)
    usage: allocate the stream private data and writer the stream header to an output media file. param s media file
    handle, return 0 if OK, AVERROR_xxx if error.
    write the stream header, if any
    av_write_header(oc);
    9. static void write_video_frame(AVFormatContext *oc, AVStream *st)
    write_video_frame(oc, video_st);
    10. static void close_video(AVFormatContext *oc, AVStream *st)
    // close each codec
    close_video(oc, video_st);
    11. int av_write_trailer(AVFormatContext *s)
    usage: write the trailer, if any. Write the stream trailer to an output media file and free the file private data.
    av_write_trailer(oc);
    12. void av_freep(void *arg)
    usage: free the streams. Frees memory and sets the pointer to NULL. arg pointer to the pointer which should be freed .
    av_freep(&oc->streams->codec);
    av_freeep(&oc->streams[s]);
    13. int url_fclose(ByteIOContext *s);
    usage: close the output file
    url_fclose(&oc->pb);
    14. void av_free(void *ptr)
    usage: free the stream. Free memory which has been allocated with av_malloc(z)() or av_realloc().
    av_free(oc);
    /******************************************************************
    ******************************************************************
    add_video_stream()
    AVCodecContext *c
    AVStream *st
    ******************************************************************/
    ******************************************************************
    1.AVStream *av_new_stream(AVFormatContext *s, int id)
    usage: add a new stream to a media file. s: media file handle, id: file format dependent stream id
    st = av_new_stream(oc, 0);
    /******************************************************************
    ******************************************************************
    open_video()
    AVCodecContext *c
    AVCodec *codec
    AVFrame *picture, *tmp_picture
    uint8_t *video_output
    int frame_count, video_outbuf_size;
    ******************************************************************
    ******************************************************************/
    1 AVCodec *avcodec_find_encoder(enum CodecID id)
    usage: find the codec of encoder by CodecID. 在前面main中的guess_format()就已经开始为此准备了。
    codec = avcodec_find_encoder(c->codec_id);
    2 int avcodec_open(AVCodecContext *avctx, AVCodec *codec);
    usage: opens / inits the AVCodecContext. 打开失败的话,返回值小于零。
    avcodec_open(c, codec);
    3 void *av_malloc(unsigned in size);
    usage: you can redefine av_malloc and av_free in your project to use your memory allocator. You do not need to suppress this file because the linker will do it automatically
    Memory allocation of size byte with alignment suitable for all memory accesses (including vectors if available on the CPU). av_malloc(0) must return a non NULL pointer.
    video_outbuf_size = 200000;
    video_outbuf = avmalloc(video_outbuf_size);
    4 static AVFrame *alloc_picture(int pix_fmt, int width, int height)
    picture = alloc_picture(c->pix_fmt, c->width, c->height);
    /******************************************************************
    ******************************************************************
    ******************************************************************
    alloc_picture()
    AVFrame *picture
    uint8_t *picture_buf
    int size
    ******************************************************************
    ******************************************************************/
    ******************************************************************
    1. avcodec_alloc_frame()
    usage: initialize AVFrame* picture
    picture = avcodec_alloc_frame()
    2. int avpicture_get_size(int pix_fmt, int width, int height)
    usage: 根据像素格式和视频分辨率获得picture存储大小。
    size = avpicture_get_size(pix_fmt, width, height);
    picture_buf = av_malloc(size)
    3. int avpicture_fill(AVPicture *picture, uint8_t *ptr, int pix_fmt, int width, int height)
    usage: Picture field are filled with ‘ptr’ addresses, also return size。用ptr中的内容根据文件格式(YUV…) 和分辨率填充picture。这里由于是在初始化阶段,所以填充的可能全是零。
    avpicture_fill((AVPicture*)picture, picture_buf, pix_fmt, width, height);
    /******************************************************************
    ******************************************************************
    write_video_frame()
    int out_size, ret;
    AVCodecContext *c;
    static struct SwsContext *img_convert_ctx
    ******************************************************************
    ******************************************************************/
    1 struct SwsContext *sws_getContext(int srcW, ……)
    usage: 转变raw picture格式的获取context函数,比如下面的代码就是将其他格式的(如yuv422)转为yuv420,就要将context 保存在img_convert_ctx中,然后再利用后面的介绍函数做转化。
    img_convert_ctx = sws_getContext(c->width, c->height,
    PIX_FMT_YUV420P,
    c->width, c->height,
    c->pix_fmt,
    sws_flags, NULL, NULL, NULL);
    2 int sws_scale(struct SwsContext *ctx, uing8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]);
    usage: 根据SwsContext保存的目标文件context将src(source)转为dst(destination)。
    sws_scale(img_convert_ctx, tmp_picture->data, tmp_picture->linesize, 0, c->height, picture->data, picture->linesize);
    4. int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, const AVFrame *pict);
    usage: 根据AVCodecContext将pict编码到buf中,buf_size是buf的大小。
    out_size = avcodec_encode_video(c, video_outbuf, video_outbuf_size, picture);
    5 static inline void av_init_packet(AVPacket *pkt)
    usage: initialize optional fields of a packet.初始化AVPacket。
    AVPacket pkt;
    av_init_packet(&pkt)
    6 int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
    usage: 校准时间基(maybe)
    pkt.pts = av_rescale_q(c->coded_frame->pts, c->time_base, st->time_base);
    7 int av_write_frame(AVFormatContext *s, AVPacket *pkt)
    usage: write a packet to an output media file . pkt: the packet, which contains the stream_index, buf/buf_size, dts/pts, …if error returncodec);
    av_free(picture->data[0]);
    av_free(picture);
    if (tmp_picture) {
    av_free(tmp_picture->data[0]);
    av_free(tmp_picture);
    }
    av_free(video_outbuf);
    }
    更多相关内容
  • FFmpeg使用手册(FFmpeg官方文档中文翻译).pdf ,本压缩包内容为PDF格式书籍文件,内容高清 ,有问题欢迎随时站内私信联系,拒绝差评,谢谢!
  • ffmpeg最新版命令手册和相关例程详细说明
  • FFmpeg使用中文手册

    2018-11-05 10:28:19
    FFmpeg中文使用手册,很详细的介绍,值得参考 FFmpeg 的基本组成
  • FFMpeg中文开发手册.rar

    2021-09-01 10:59:10
    FFMpeg详细的开发手册FFMpeg 中比较重要的函数以及数据结构。
  • FFmpeg中文使用手册

    2018-06-24 15:32:42
    FFMPEG 中文使用手册官方。翻译手册官方的。FFMPEG 中文使用手册官方。翻译手册官方的。
  • 这是一个讲述FFMpeg的中文手册,由于国内网络封锁,你很难访问到官网,这就是一个很好很方便的代替。
  • ffmpeg-php使用手册

    2014-04-14 09:25:24
    ffmpeg就这几个函数: ffmpeg_movie: The ffmpeg_movie object provides methods to query and manipulate movies and audio tracks. ffmpeg_frame: The ffmpeg_frame object provides methods to query ...
  • FFmpegAPI使用手册

    2018-10-26 14:30:55
    FFmpegAPI使用手册 FFmpeg的基本组成 FFmpeg 的编译安装 FFmpeg 编码支持与定制...
  • FFmpeg使用手册(FFmpeg官方文档中文翻译).rar
  • FFmpeg使用手册.pdf

    2020-08-28 18:09:48
    FFmpeg使用手册.pdf
  • 阅读本文的正确姿势Ctrl+F ffmpeg ffmpeg命令的语法结构 一般规则 输入参数 -i 流复制 Stream copy 流选择 Stream selection 自动流选择 Automatic stream selection 手动流选择 Manual stream selection -map 文件...

    文章目录

    如何阅读官网命令行?

    http://ffmpeg.org/documentation.html

    可以看到贼多命令行,比如ffmpeg-all

    在这里插入图片描述
    先看下概述,找到感觉
    在这里插入图片描述
    如何查找命令行?

    Ctrl+F
    在这里插入图片描述
    在这里插入图片描述

    阅读本文的正确姿势Ctrl+F

    ffmpeg

    ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源抓取信息。

    ffmpeg命令的语法结构

    ffmpeg [global_options] {[input_file_options] -i input_url} ... 
    {[output_file_options] output_url} ... 
    

    一般规则

    我们规定,选项应用于下一个指定的文件。因此,顺序很重要,这样才可以在命令行上多次使用相同的选项。然后将每个选项应用于下一输入或输出文件。此规则的例外是全局选项(例如,verbosity级别),应首先指定。

    不要混合输入文件和输出文件-首先指定所有输入文件,然后指定所有输出文件。也不混合属于不同文件的选项。所有选项仅用于下一个输入或输出文件,并在文件之间重置。

    输入参数 -i

    ffmpeg读取由 -i 选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、设备数据流等),并写入由输出url指定的任意数量的输出“文件”。在命令行中发现的任何不能解释为选项的内容都被视为输出url。

    举例如下:

    #To set the video bitrate of the output file to 64 kbit/s: 
    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
    
    #To force the frame rate of the output file to 24 fps: 
    ffmpeg -i input.avi -r 24 output.avi
    
    #To force the frame rate of the input file (valid for raw formats only) 
    #to 1 fps and the frame rate of the output file to 24 fps: 
    ffmpeg -r 1 -i input.m2v -r 24 output.avi
    

    流复制 Stream copy

    流复制,需要通过向-codec选项提供复制参数来选择。它使ffmpeg省略了对指定流的解码和编码步骤,因此它只进行解封装和封装。它对于更改容器格式或修改容器级元数据非常有用。在这种情况下,上面的图表将简化为:

     _______              ______________            ________
    |       |            |              |          |        |
    | input |  demuxer   | encoded data |  muxer   | output |
    | file  | ---------> | packets      | -------> | file   |
    |_______|            |______________|          |________|
    

    由于没有解码或编码,它非常快,没有质量损失。然而,由于许多因素,它在某些情况下可能行不通。显然,应用滤镜也是不可能的,因为滤镜可以处理未压缩的数据。

    流选择 Stream selection

    自动流选择 Automatic stream selection

    如果没有任何特定输出文件的映射选项,ffmpeg将检测输出格式,以检测其中可以包含哪种类型的流,即,视频、音频和/或字幕。对于每种可接受的流类型,ffmpeg将在可用时从所有输入中选择一个流。

    它根据以下标准选择流:·

    • 对于视频,选择分辨率最高的流
    • 对于音频,选择有最多频道的流
    • 对于字幕,选择第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只选择相同类型的字幕流。

    在有几个相同类型的比特率相等的情况下,选择索引最低的流。无法自动选择数据流或附件流,只能使用-map将其包括在内。

    手动流选择 Manual stream selection

    当使用-map时,该输出文件中只包含用户映射的流,当然也有例外的场景。

    -map

    每个输入或输出url原则上可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流数目和/或类型受容器格式的限制。选择哪些输入的哪些流进行输出,要么自动完成,要么使用-map选项。

    文件选择和流选择 [2:3]

    若要引用选项中的输入文件,必须使用它们的索引(基于0的)。例如:第一输入文件为0,第二输入文件为1等。类似地,文件中的流由它们的索引引用。例如:2:3指第三个输入文件中的第四个流。

    流选择 -vn/-an/-sn/-dn

    ffmpeg为手动控制每个输出文件中的流选择提供了-map选项。用户可以不使用-map,让ffmpeg执行自动流选择,
    如下所述。
    无论是手动映射还是自动选择,除了复杂滤波图的输出流,选项-vn/-an/-sn/-dn可分别用于跳过包括视频、音频、字幕和数据流。

    下面的例子说明FFmpeg的流选择方法的行为、怪癖和限制

    input file 'A.avi'
          stream 0: video 640x360
          stream 1: audio 2 channels
    input file 'B.mp4'
          stream 0: video 1920x1080
          stream 1: audio 2 channels
          stream 2: subtitles (text)
          stream 3: audio 5.1 channels
          stream 4: subtitles (text)
    input file 'C.mkv'
          stream 0: video 1280x720
          stream 1: audio 2 channels
          stream 2: subtitles (image)
    
    ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov
    

    指定了三个输出文件,对于前两个,无-map选项,因此ffmpeg将自动为这两个文件选择流。

    out1.mkv是一个高清格式文件,接受视频、音频和字幕流,因此ffmpeg将尝试选择每种类型中的一种。对于视频,它将从b.mp4中选择流0,因为它在所有输入视频流中具有最高的分辨率。对于音频,它将从b.mp4中选择流3,因为它有最多的频道。对于字幕,它将从b.mp4中选择流2,这是a.avib.mp4中的第一个字幕流。

    输出2.wav只接受音频流,因此只选择b.mp4中的流3

    对于out3.mov,由于设置了-map选项,因此不会出现自动流选择。-map 1:a选项将从第二个输入b.mp4中选择所有音频流。此输出文件中不会包含其他流。

    对于前两个输出,所有包含的流都将被转码。所选择的编码器将是由每种输出格式注册的默认编码器,这可能与所选输入流的编解码器不匹配。

    对于第三个输出,音频流的codec选项(-c:a)已设置为复制,因此不会发生或可能发生解码-滤镜-编码操作。所选流的packets编码数据包从输入文件中传输,然后封装到输出文件中。
    在这里插入图片描述

    自动字幕流选择 automatic subtitles selection

    ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
    

    虽然out1.mkv是一个接受字幕流的高清格式文件,但只能选择一个视频和音频流。C.mkv的字幕流是基于图像的,mkv 封装器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不会选择流。

    但是,在out2.mkv中,命令中指定了字幕编码器,因此,除了视频流之外,还选择了字幕流。out2.mkv-an禁用音频流的选择。

    不加标签的滤镜输出 unlabeled filtergraph outputs

    ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
    

    这里使用-filter_complex选项设置了一个滤镜,它由一个视频滤镜组成。overlay滤镜需要两个视频输入,但没有指定,因此使用了前两个可用的视频流,即a.avic.mkv的视频流。滤镜的输出面板没有标签,因此被传递到第一个输出文件out1.mp4。因此,将跳过视频流的自动选择,这将选择b.mp4中的视频流。具有最多数量频道的音频流,即b.mp4中的流3,会被自动选择。但是没有选择字幕流,因为MP4格式没有默认的字幕编码器注册,而且用户没有指定字幕编码器。

    第二个输出文件out2.srt只接受基于文本的字幕流。因此,尽管可用的第一个字幕流属于c.mkv,但它是基于图像的,因此跳过了。选定的流,b.mp4中的流2,是第一个基于文本的字幕流。

    带标签的滤镜输出labeled filtergraph outputs

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex 
    "[1:v]hue=s=0[outv];overlay;aresample" \
           -map '[outv]' -an        out1.mp4 \
                                    out2.mkv \
           -map '[outv]' -map 1:a:0 out3.mkv
    

    以上命令将失败,因为标记为[outv]的输出标签已被映射两次。不处理任何输出文件。

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex 
    "[1:v]hue=s=0[outv];overlay;aresample" \
           -an        out1.mp4 \
                      out2.mkv \
           -map 1:a:0 out3.mkv
    

    上面的命令也会失败,因为色调滤镜输出有一个标签[outv],并且没有被映射到任何地方。

    应修改为如下命令:

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex 
    "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
            -map '[outv1]' -an        out1.mp4 \
                                      out2.mkv \
            -map '[outv2]' -map 1:a:0 out3.mkv
    

    来自b.mp4的视频流被发送到色调滤镜,其输出使用分割滤镜被克隆一次,并且这两个输出都有标签。然后,将每个副本映射到第一和第三输出文件。

    overlay滤镜需要两个视频输入,使用前两个未使用的视频流。这些是来自a.avic.mkv的流。overlay 输出没有标签,因此它被传递到第一个输出文件out1.mp4,而不考虑-map选项的存在。

    aresample滤镜被应用给第一个未使用的音频流,即a.avi的音频流。因为这个滤镜输出也没有标签,所以它也被映射到第一个输出文件。-an选项会抑制音频流的自动或手动选择,而不是从滤镜获取输出。这两个映射流都应在输出1.mp4中的映射流之前排序。

    映射到out2.mkv的视频、音频和字幕流完全由自动流选择决定。

    out3.mkv由来自色调滤镜克隆的视频输出和来自b.mp4的第一个音频流组成。

    选项Options

    流说明符 Stream specifiers

    有些选项应用于每个流,例如比bitrate比特率 或编解码器codec。流说明符用于精确指定给定选项所属的流。流说明符是通常附加到选项名称并由冒号分隔的字符串。例如a:1 ac3包含与第二音频流匹配的a:1流说明符。因此,它将为第二音频流选择ac3编解码器。流说明符可以匹配多个流,以便将该选项应用到所有流。例如-b:a 128K匹配所有音频流。空的流说明符匹配所有流。例如,-codec copy-codec: copy复制所有流,而无需重新编码。

    流说明符的可能形式是:

    流索引 stream_index

    将流与索引匹配。例如:-threads:1 4将第二流的线程数量设置为4。如果使用stream_index作为附加的流说明符(见下文),那么它将从匹配的流中选择流号stream_index。流编号是基于libavformat 检测到的流的顺序,除非 program ID也被指定,在这种情况下,它是基于程序中流的排序。

    stream_type[:additional_stream_specifier]

    stream_type是以下内容之一:vV,用于视频,a用于音频,s用于字幕,d用于数据,而t用于附件。v匹配所有视频流,V仅匹配未连接图片、视频缩略图或封面艺术的视频流。如果使用了附加流说明符,则它匹配具有和此类型以及附加流说明符匹配的流。否则,它与指定类型的所有流匹配。

    通用选项 Generic options

    这些选项在ff*工具上都可使用。
    -L
    显示版权信息
    -h-?-help--help[arg]
    显示帮助信息。可以指定可选参数来打印有关特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。

    arg的可能值包括:

    long

    除了基本工具选项外,还可以打印高级工具选项。

    full

    打印完整的选项列表,包括encoders编码器、decoders解码器、demuxers解封装器、muxers封装器、滤镜等的共享和私有选项。

    decoder=decoder_name

    打印指定解码器的详细信息。使用-decoders选项打印所有解码器的列表。

    encoder=encoder_name

    打印指定编码器的详细信息。使用-encoders选项打印所有编码器。

    demuxer=demuxer_name

    打印指定demuxer 的详细信息。使用-format选项打印所有demuxersmuxers

    muxer=muxer_name

    打印指定muxer 的详细信息。使用-format选项打印所有demuxersmuxers

    filter=filter_name

    打印指定滤镜的详细信息。使用-filters选项打印所有滤镜。

    bsf=bitstream_filter_name

    打印指定位流滤镜的详细信息。使用-bsfs选项打印所有位流滤镜。

    -version

    显示版本信息

    -formats

    显示可用格式(包括设备)。

    -demuxers

    显示可用的demuxers解封装器

    -muxers

    显示可用的muxers封装器

    -devices

    显示可用的设备devices

    -codecs

    显示所有libavcodec中已知的编解码器。

    -decoders

    显示可用的解码器decoders

    -encoders

    显示可用的编码器encoders

    -bsfs

    显示可用的位流滤镜bitstream filters

    -protocols

    显示可用的协议

    -filters

    显示libavfilter 中可用的滤镜

    -pix_fmts

    显示所有支持的像素格式

    -sample_fmts

    显示可用的采样格式。

    -layouts

    显示音频通道名称和标准音频通道布局。

    -colors

    显示可识别的颜色名称。

    -sources device[,opt1=val1[,opt2=val2]…]

    显示输入设备的自动检测源。一些设备可以提供无法自动检测的依赖于系统的源名称。返回的列表不一定总是完整的。

    ffmpeg -sources pulse,server=192.168.0.4
    

    -sinks device[,opt1=val1[,opt2=val2]…]

    显示输出设备的自动检测接收器。有些设备可能提供无法自动检测到依赖于系统的接收器名称。返回的列表不一定是完整的。

    ffmpeg -sinks pulse,server=192.168.0.4
    

    -loglevel [flags+]loglevel | -v [flags+]loglevel

    设置由库使用的日志级别和标志。

    可选标志前缀可以由以下值组成:

    repeat

    Indicates that repeated log output should not be compressed to the first 
    line and the "Last message repeated n times" line will be omitted. 
    

    指示不应将重复日志输出压缩到第一行,并且…

    level

    指示日志输出应在每条消息行中添加一个[level]前缀。这可以用作日志着色,例如,当将日志转储到文件中时。

    Flags can also be used alone by adding a ’+/-’ prefix to set/reset a single flag without affecting 
    other flags or changing loglevel. When setting both flags and loglevel, a ’+’ separator 
    is expected between the last flags value and before loglevel. 
    

    也可以通过添加+/-前缀来单独使用标志,以设置/重置单个标志,而不影响其他标志或更改日志级别。设置“标志”和“LogLevel”时,在最后一个标志值和LogLevel之前都会有一个+分隔符。

    loglevel 是字符串或包含以下值之一的数字:

    quiet, -8

    不输出任何信息

    panic, 0

    只显示可能导致进程崩溃的致命错误,例如断言失败。目前没有用于任何地方。

    fatal, 8

    只显示致命的错误。这些错误出现在进程绝对不能继续下去的时候。

    error, 16

    显示所有错误,包括可以从其中恢复的错误。

    warning, 24

    显示所有警告和错误。将显示可能发生的不正确或意外事件有关的任何消息。

    info, 32

    在处理期间显示信息级别的消息,这是默认值。

    verbose, 40

    和信息级别一样,但是更冗长。

    debug, 48

    显示所有内容,包括调试信息。

    例如,要启用重复的日志输出,添加级别前缀,并将日志级别设置为verbose

    ffmpeg -loglevel repeat+level+verbose -i input output
    

    在不影响级别前缀标志或日志级别的当前状态的情况下启用重复日志输出的另一个示例:

    ffmpeg [...] -loglevel +repeat
    

    默认情况下,程序记录到stderr。如果终端支持着色,则使用颜色标记错误和警告。可以禁用日志着色,设置环境变量AV_LOG_FORCE_NOCOLORNO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。不推荐使用环境变量NO_COLOR,并将在以后的ffmpeg版本中删除。

    AVOptions

    这些选项由libavformatlibavdevicelibavcodec库直接提供。要查看可用的AVOptions列表,请使用-help选项。它们分为两类:

    通用选项generic

    可以为任何文件格式、编解码器或设备设置这些选项。通用选项在用于文件格式/设备的AVFormatContext选项下,并在编解码器的AVCodecContext上下文选项下列出。

    私有选项private

    这些选项特定于给定的文件格式、设备或编解码器。相应的文件格式/设备/编解码器下列出了私有选项。

    例如,要将id3v2.3头而不是默认的id3v2.4写入mp3文件,使用mp3 muxer的id3v2_version私有选项:

    ffmpeg -i input.flac -id3v2_version 3 out.mp3
    

    所有编解码器的AVOptions都是应用于每个流的,因此应该附加一个流说明符:

    ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k 
    -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
    

    在上面的例子中,一个多声道音频流被映射两次以便输出。第一个实例由编码器ac3指定比特率640 k编码。第二个实例被降至2个信道,并使用编码器aac编码。使用输出流的绝对索引为它指定128 k的比特率。

    注意:-nooption语法不能用于布尔选项,请使用 -option 0/-option 1.

    注意:通过在选项名称前面加上v/a/s来指定每个流的AVOptions的旧的无文档化方法现在已经过时,并将很快被删除。

    主要选项 Main options

    -f fmt (input/output)

    强制输入或输出文件格式。通常自动检测输入文件的格式,并从输出文件的文件扩展名中猜测格式,因此在大多数情况下不需要此选项。

    -i url (input)

    输入文件的url

    -y (global)

    强制覆盖输出文件

    -n (global)

    不要覆盖输出文件,如果指定的输出文件已经存在,则立即退出。

    -stream_loop number (input)

    设置输入流的循环次数。循环0表示没有循环,循环-1表示无限循环.

    -c[:stream_specifier] codec (input/output,per-stream)

    -codec[:stream_specifier] codec (input/output,per-stream)

    为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用)。codec或者c填值解码器/编码器的名称,codec或者c填值copy,表示(仅输出),以指示流不被重新编码。

    举例:

    ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
    

    用libx264对所有视频流进行编码,并复制所有音频流。

    ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
    

    复制所有流,除了将用libx264编码的第2个视频流和将用libvorbis编码的第138个音频流。

    -t duration (input/output)

    -to position (input/output)

    当用作输入选项(在-i之前)时,限制从输入文件读取数据的持续时间。当用作输出选项时(在输出url之前),在输出持续时间达到持续时间后停止写入输出。duration 必须是时间期限规范,请参阅(ffmpeg-utils)在ffmpeg-utils(1)手册中的时间duration 部分。-to-t是相互排斥的,-t有优先权。

    -fs limit_size (output)

    设置文件大小限制,以字节表示。超过限制后,不再写入更多的字节块。输出文件的大小略大于请求的文件大小。

    -ss position (input/output)

    当用作输入选项(-i之前)时,在此输入文件中定位位置。请注意,在大多数格式中,不可能精确地寻找,因此ffmpeg将在位置之前定位到最接近的点。当启用转码transcoding 和-精确定位-accurate_seek(默认)时,seek pointposition 之间的这个额外段将被解码和丢弃。当做流复制或当使用 -noaccurate_seek 的寻求时,它将被保存。

    当用作输出选项时(在输出url之前),解码但丢弃输入,直到时间戳到达位置。位置必须是time duration规范,请参阅(ffmpeg-utils)在ffmpeg-utils(1)手册中的time duration部分。

    -sseof position (input)

    Like the -ss option but relative to the "end of file". 
    That is negative values are earlier in the file, 0 is at EOF. 
    

    -ss选项类似,但相对于"文件结束"。这是文件中较早的负值,0EOF

    -itsoffset offset (input)

    设置输入时间偏移。偏移量必须是 time duration 规范,参见FFmpeg-utils(1)手册中的 time duration 部分。将偏移添加到输入文件的时间戳中。指定正偏移意味着对应的流被延迟指定的持续时间。

    -itsscale scale (input,per-stream)

    重新调整输入时间戳。scale 用浮点数。

    -timestamp date (output)

    在文件格式容器中设置记录时间戳。日期必须是日期规格,请参阅FFmpeg-utils(1)手册中的日期部分。

    -metadata[:metadata_specifier] key=value (output,per-metadata)

    设置元数据 key/value对。
    可以给出可选的元数据_说明符以在流、章节或程序上设置元数据。有关详细信息,请参见
    -map_metadata文档。
    此选项将覆盖带有-map_metadata的元数据集。也可以通过使用空的值来删除元数据。
    例如,用于在输出文件中设置标题:

    ffmpeg -i in.avi -metadata title="my title" out.flv
    

    要设置第一个音频流的语言,请执行以下操作:

    ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
    

    -dn (input/output)

    作为输入选项,阻止文件的所有数据流被过滤或被自动选择或映射到任何输出。请参见-discard选项以单独禁用流。作为输出选项,禁用数据,即任何数据流的自动选择或映射。有关完整的手动控制,请参见-map选项。

    -frame:d

    设置要输出的数据帧数。

    -frames[:stream_specifier] framecount (output,per-stream)

    在framecount 个帧之后停止写入流。

    -filter[:stream_specifier] filtergraph (output,per-stream)

    创建指定的滤镜,并使用它来过滤流。必须具有相同类型的流的单个输入和单个输出。。有关filtergraph 语法的详细信息,请参见FFmpeg-filter手册。如果要创建具有多个输入和/或输出的filtergraphs,请参见-filter_complex选项。

    -vf filtergraph (output)

    创建filtergraph ,并使用它来过滤流。这是-filter:v的别名,请参见-filter选项。

    表达式赋值 Expression Evaluation

    当计算算术表达式的值时,FFmpeg使用通过libavutil/eval.h接口实现的内部公式求值程序。表达式可以包含一元二元运算符常量函数。两个表达式expr1expr2 可以合并以形成另一个表达式"expr1;expr2 "expr1expr2 依次进行计算,新的表达式计算为expr2的值。二元运算符:+、-、*、/、^。一元运算符:+,-

    函数:

    abs(x)

    计算X的绝对值。

    acos(x)

    计算x的反余弦

    asin(x)

    计算x的反正弦

    atan(x)

    计算X的反正切。

    atan2(x, y)

    Compute principal value of the arc tangent of y/x. 
    

    between(x, min, max)

    如果min<=x<=max,则返回1,否则返回0

    bitand(x, y)

    bitor(x, y)

    XY上计算按位和/或运算。在执行按位操作之前,将XY的求值结果转换为整数。请注意,转换为整数再转换回浮点会失去精度。注意大数的意外结果(2^53和更大)。

    ceil(expr)

    将表达式expr的值向上舍入到最近的整数。例如,"ceil(1.5)“是”2.0"。

    clip(x, min, max)

    Return the value of x clipped between min and max. 
    

    cos(x)

    计算X的余弦。

    cosh(x)

    Compute hyperbolic cosine of x. 
    

    eq(x, y)

    如果XY相等,则返回1,否则返回0

    exp(x)

    Compute exponential of x (with base e, the Euler’s number). 
    

    计算x的指数(以e为基数,欧拉数)。

    floor(expr)

    将表达式expr 的值向下舍入到最近的整数。例如,“floor(-1.5)”为“-2.0”。

    gauss(x)

    Compute Gauss function of x, corresponding to exp(-x*x/2) / sqrt(2*PI). 
    

    计算x的高斯函数,对应于exp(-x*x/2)/sqrt(2*PI)

    gcd(x, y)

    Return the greatest common divisor of x and y. If both x and y are 0 or either 
    or both are less than zero then behavior is undefined. 
    

    返回xy的最大公因子。如果xy都是0,或者两者都小于0,则…。

    gt(x, y)

    如果x>y,则返回1,否则为0

    gte(x, y)

    如果x>=y,则返回1,否则返回0

    hypot(x, y)

    此函数类似于同名的c函数;它返回“sqrt(x*xy*y)”,即直角边长度为xy的直角三角形的斜边长度,或点(x,y)原点的距离。

    if(x, y)

    Evaluate x, and if the result is non-zero return the result of the evaluation of y, 
    return 0 otherwise. 
    

    if(x, y, z)

    Evaluate x, and if the result is non-zero return the evaluation result of y, 
    otherwise the evaluation result of z. 
    

    ifnot(x, y)

    Evaluate x, and if the result is zero return the result of the evaluation of y, 
    return 0 otherwise. 
    

    ifnot(x, y, z)

    Evaluate x, and if the result is zero return the evaluation result of y, 
    otherwise the evaluation result of z. 
    

    isinf(x)

    如果x+/-无穷大,则返回1.0,否则返回0.0

    isnan(x)

    如果XNaN(not a number非数字),则返回1.0,否则为0.0

    ld(var)

    Load the value of the internal variable with number var, which was previously stored with
    st(var, expr). The function returns the loaded value. 
    

    lerp(x, y, z)

    Return linear interpolation between x and y by amount of z. 
    

    xy之间通过z的量返回线性插值。

    log(x)

    计算x的自然对数。

    lt(x, y)

    如果x<y,则返回1,否则为0

    lte(x, y)

    如果x<=y,则返回1,否则返回0

    max(x, y)

    返回xy中的最大值。

    min(x, y)

    返回xy中的最小值。

    mod(x, y)

    计算x%y

    not(expr)

    如果expr0,则返回1.0,否则返回0.0

    pow(x, y)

    计算x^y

    print(t)

    print(t, l)

    loglevel 打印表达式t的值。如果未指定l,则使用默认日志级别。返回打印的表达式的值。

    random(x)

    Return a pseudo random value between 0.0 and 1.0. 
    x is the index of the internal variable which will be used to save the seed/state. 
    

    返回0.01.0之间的伪随机值。

    round(expr)

    将表达式expr的值四舍五入。例如,"round(1.5)“是”2.0"。

    sgn(x)

    Compute sign of x. 
    

    sin(x)

    计算x的正弦。

    sinh(x)

    Compute hyperbolic sine of x. 
    

    tan(x)

    计算x的正切

    tanh(x)

    Compute hyperbolic tangent of x. 
    

    -pix_fmt

    设置像素格式。如果所设置的像素格式不能被设置成功,

    在这里插入图片描述
    本文将持续更新,敬请关注

    欢迎联系、指正、批评

    Github:https://github.com/AnJiaoDe

    CSDN:https://blog.csdn.net/confusing_awakening

    OpenCV入门教程:https://blog.csdn.net/confusing_awakening/article/details/113372425

    ffmpeg入门教程:https://blog.csdn.net/confusing_awakening/article/details/102007792

    微信公众号
    这里写图片描述

    QQ群

    这里写图片描述

    展开全文
  • ffmpeg开发手册.7z

    2020-03-06 10:52:21
    ffmpeg开发手册,非常好的ffmpeg资料,详实,易懂,权威,值得拥有,希望对你的工作学习有所帮助。
  • ffmpeg 开发详解手册

    2012-11-04 12:54:04
    详细介绍了ffmeg使用的参数命令,希望对大家有帮助
  • ffmpeg开发手册精简

    2018-06-02 11:39:20
    本文档全整理自ffmpeg工程组网站 ,所有内容均出自此处,各 人没有做任何修改。因为工作当中需要用到ffmpeg,在线查看不是太方便,所以利用非工 作时间, 整理了四份文档供方便学习之用。 平时工作太忙时间有限, ...
  • ffmpeg.js 该库提供了使用将FFmpeg构建移植到JavaScript的功能。 生成针对浏览器内部使用进行了优化:最小的大小可加快加载速度,asm.js,性能调整等。尽管它们也可在Node中使用。 建物 当前可用的版本(将来可能会...
  • FFMPEG开发指南.pdf

    2021-09-27 12:55:42
    FFMPEG开发指南.pdf
  • FFMPEG命令手册

    2018-12-26 10:53:08
    FFMPEG命令行手册,视频处理基础,有利于视频、音频文件的理解
  • ffmpeg的基本组成,编译安装,到常用命令的讲解说明,全面系统的介绍了ffmpeg的使用。值得推荐。
  • ffmpeg参考手册

    千次阅读 2017-05-09 16:18:13
    FFmpeg FFmpeg 基本用法 本课要解决的问题 1.FFmpeg的转码流程是什么? 2.常见的视频格式包含哪些内容吗? 3.如何把这些内容从视频文件中抽取出来? 4.如何从一种格式转换为另一种格式? 5....

    FFmpeg

    FFmpeg 基本用法

    本课要解决的问题

    1.FFmpeg的转码流程是什么?

    2.常见的视频格式包含哪些内容吗?

    3.如何把这些内容从视频文件中抽取出来?

    4.如何从一种格式转换为另一种格式?

    5.如何放大和缩小视频?

    6.如何旋转,翻转,填充,裁剪,模糊,锐化视频?

    7.如何给视频加logo,删除logo?

    8.如何给视频加文本,动态文本?

    9.如何处理图片?

    10.如何录像,添加动态logo,截图,马赛克视频?

    第一部分

    基础

    术语

    容器(Container)

    容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。

    流(Stream)

    是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。

    帧(Frame)

    帧代表一幅静止的图像,分为I帧,P帧,B帧。

    编解码器(Codec)

    是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)

    复用/解复用(mux/demux)

    把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)

    把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

     

     

    简介

     

    FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。

     

    FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。

    组成

    1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;

    2、libavcodec:用于各种类型声音/图像编解码;

    3、libavutil:包含一些公共的工具函数;

    4、libswscale:用于视频场景比例缩放、色彩映射转换;

    5、libpostproc:用于后期效果处理;

    6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;

    7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;

    8、ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;

     

    FFmpeg处理流程

    过滤器(Filter)

    在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。

    语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…

    过滤器图link label :是标记过滤器的输入或输出的名称

    1.视频过滤器 -vf

    如testsrc视频按顺时针方向旋转90度

    ffplay -f lavfi -i testsrc -vf transpose=1

    如testsrc视频水平翻转(左右翻转)

    ffplay -f lavfi -i testsrc -vf hflip

    2.音频过滤器 -af

    实现慢速播放,声音速度是原始速度的50%

    ffplay p629100.mp3 -af atempo=0.5

     

    如何实现顺时针旋转90度并水平翻转? 

    过滤器链(Filterchain)

    基本语法

    Filterchain = 逗号分隔的一组filter

    语法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”

    顺时针旋转90度并水平翻转

    ffplay -f lavfi -i testsrc -vf transpose=1,hflip

     

     

     

     

    如何实现水平翻转视频和源视频进行比较? 看过滤器链是如何实现的。

     

     

     

     

     

     

    过滤器链(Filterchain)

    第一步: 源视频宽度扩大两倍。

    ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4

    第二步:源视频水平翻转

    ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4

    第三步:水平翻转视频覆盖output.mp4

    ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4

    是不是很复杂?

    用带有链接标记的过滤器图(Filtergraph)只需一条命令。

    过滤器图(Filtergraph)

    基本语法

    Filtergraph = 分号分隔的一组filterchain

    “filterchain1;filterchain2;…filterchainN-1;filterchainN”

     

     

    Filtergraph的分类

    1、简单(simple) 一对一

    2、复杂(complex)多对一, 多对多

    过滤器图(Filtergraph)

    简单过滤器图处理流程:

     

     

    复杂过滤器图处理流程:

     

     

     

    从图中可以发现复杂过滤器图比简单过滤器图少2个步骤,效率比简单高,ffmpeg建议尽量使用复杂过滤器图。

    回答上面提的问题,实现水平翻转视频和源视频进行比较

     

    过滤器图(Filtergraph)

    用ffplay直接观看结果:

    ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w

     

     

     

     

    F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]

    F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].

    F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].

    F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.

     

     

    选择媒体流

    一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?

    语法:

    -map file_number:stream_type[:stream_number]

     

    这有一些特别流符号的说明:

    1、-map 0 选择第一个文件的所有流

    2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。

    3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。

     

    注意:文件序号和流序号从0开始计数。

    选择媒体流

    第二部分

    查看帮助

    帮助

    FFmpeg工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,ffplay和ffprobe也有一些类似的选项。

     

    帮助

    可用的bit流 :ffmpeg –bsfs

    可用的编解码器:ffmpeg –codecs

    可用的解码器:ffmpeg –decoders

    可用的编码器:ffmpeg –encoders

    可用的过滤器:ffmpeg –filters

    可用的视频格式:ffmpeg –formats

    可用的声道布局:ffmpeg –layouts

    可用的license:ffmpeg –L

    可用的像素格式:ffmpeg –pix_fmts

    可用的协议:ffmpeg -protocals

     

    第三部分

    码率、帧率和文件大小

    概述

            码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。

     

    帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。

    码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。

    帧率

    1、用 -r 参数设置帧率

    ffmpeg –i input –r fps output

    2、用fps filter设置帧率

    ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm

    帧率的预定义值:

     

     

     

     

     

    例如设置码率为29.97fps,下面三种方式具有相同的结果:

    ffmpeg -i input.avi -r 29.97 output.mpg

    ffmpeg -i input.avi -r 30000/1001 output.mpg

    ffmpeg -i input.avi -r netsc output.mpg

     

    码率、文件大小

    设置码率 –b 参数

    -b 

    ffmpeg -i film.avi -b 1.5M film.mp4

     

    音频:-b:a     视频: - b:v

    设置视频码率为1500kbps

    ffmpeg -i input.avi -b:v 1500k output.mp4

     

    控制输出文件大小

    -fs (file size首字母缩写) 

    ffmpeg -i input.avi -fs 1024K output.mp4

    计算输出文件大小

    (视频码率+音频码率) * 时长 /8 = 文件大小K

     

     

    第四部分

    调整视频分辨率

    调整视频分辨率

    1、用-s参数设置视频分辨率,参数值wxh,w宽度单位是像素,h高度单位是像素

    ffmpeg -i input_file -s 320x240 output_file

     

    2、预定义的视频尺寸

    下面两条命令有相同效果

    ffmpeg -i input.avi -s 640x480 output.avi

    ffmpeg -i input.avi -s vga output.avi

     

    下表列出了所有的预定义尺寸

     

     

     

     

    Scale filter调整分辨率

    Scale filter的优点是可以使用一些额外的参数

    语法:

    Scale=width:height[:interl={1|-1}]

    下表列出了常用的额外参数

    举例

    下面两条命令有相同效果

    ffmpeg -i input.mpg -s 320x240 output.mp4 

    ffmpeg -i input.mpg -vf scale=320:240 output.mp4

     

    对输入视频成比例缩放

    改变为源视频一半大小

    ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4

    改变为原视频的90%大小:

    ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4

     

    举例

    在未知视频的分辨率时,保证调整的分辨率与源视频有相同的横纵比。

    宽度固定400,高度成比例:

    ffmpeg -i input.avi -vf scale=400:400/a

    ffmpeg -i input.avi -vf scale=400:-1

     

    相反地,高度固定300,宽度成比例:

    ffmpeg -i input.avi -vf scale=-1:300

    ffmpeg -i input.avi -vf scale=300*a:300

     

    第五部分

    裁剪/填充视频

    裁剪视频crop filter

    从输入文件中选取你想要的矩形区域到输出文件中,常见用来去视频黑边。

    语法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]

     

    举例

    裁剪输入视频的左三分之一,中间三分之一,右三分之一:

    ffmpeg -i input -vf crop=iw/3:ih :0:0 output 

    ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output 

    ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output

    裁剪帧的中心

    当我们想裁剪区域在帧的中间时,裁剪filter可以跳过输入x和y值,他们的默认值是

    Xdefault  = ( input width - output width)/2 

    Ydefault  = ( input height - output height)/2

    ffmpeg -i input_file -v crop=w:h output_file

    裁剪中间一半区域:

    ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi

     

    举例

    比较裁剪后的视频和源视频比较

    ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40

     

     

    自动检测裁剪区域

    cropdetect  filter 自动检测黑边区域

    ffplay jidu.mp4 -vf cropdetect

     

     

     

     

    然后用检测到的值来裁剪视频

    ffplay jidu.mp4 –vf crop=672:272:0:54

     

     

    填充视频(pad)

    在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比

    语法:pad=width[:height:[:x[:y:[:color]]]]

     

     

    举例

    创建一个30个像素的粉色宽度来包围一个SVGA尺寸的图片:

    ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

    ?

     

     

     

    同理可以制作testsrc视频用30个像素粉色包围视频

    ffplay  -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink

     

    4:3到16:9

    一些设备只能播放16:9的横纵比,4:3的横纵比必须在水平方向的两边填充成16:9,

     

    高度被保持,宽度等于高度乘以16/9,x(输入文件水平位移)值由表达式(output_width - input_width)/2来计算。

     

    4:3到16:9的通用命令是:

    ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output

     

    举例

    ffplay  -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink

     

    16:9到4:3

    为了用4:3的横纵比来显示16:9的横纵比,填充输入文件的垂直两边,宽度保持不变,高度是宽度的3/4,y值(输入文件的垂直偏移量)是由一个表达式(output_height-input_height)/2计算出来的。

     

    16:9到4:3的通用命令:

    ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output

     

    举例

    ffplay  -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink

     

     

    第六部分

    翻转和旋转

    翻转

    水平翻转语法: -vf hflip

    ffplay -f lavfi -i testsrc -vf hflip

     

     

     

     

    垂直翻转语法:-vf vflip

    ffplay -f lavfi -i testsrc -vf vflip

     

    旋转

    语法:transpose={0,1,2,3}

    0:逆时针旋转90°然后垂直翻转

    1:顺时针旋转90°

    2:逆时针旋转90°

    3:顺时针旋转90°然后水平翻转

    第七部分

    模糊,锐化

    模糊

    语法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]

    ffplay -f lavfi -i testsrc -vf  boxblur=1:10:4:10

    注意:luma_r和alpha_r半径取值范围是0~min(w,h)/2, chroma_r半径的取值范围是0~min(cw/ch)/2

    锐化

    语法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount

    所有的参数是可选的,默认值是5:5:1.0:5:5:0.0

    l_msize_x:水平亮度矩阵,取值范围3-13,默认值为5

    l_msize_y:垂直亮度矩阵,取值范围3-13,默认值为5

    l_amount:亮度强度,取值范围-2.0-5.0,负数为模糊效果,默认值1.0

    c_msize_x:水平色彩矩阵,取值范围3-13,默认值5

    c_msize_y:垂直色彩矩阵,取值范围3-13,默认值5

    c_amount:色彩强度,取值范围-2.0-5.0,负数为模糊效果,默认值0.0

    举例

    使用默认值,亮度矩阵为5x5和亮度值为1.0

    ffmpeg -i input -vf unsharp output.mp4

    高斯模糊效果(比较强的模糊):

    ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2

     

    第八部分

    覆盖(画中画)

    覆盖

    语法:overlay[=x[:y]

    所有的参数都是可选,默认值都是0

     

    举例

    Logo在左上角

    ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

     

    举例

    右上角:

    ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w  pair2.mp4

    左下角:

    ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h  pair2.mp4

    右下角:

    ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h  pair2.mp4

     

    删除logo

    语法:-vf delogo=x:y:w:h[:t[:show]]

    x:y 离左上角的坐标

    w:h  logo的宽和高

    t: 矩形边缘的厚度默认值4

    show:若设置为1有一个绿色的矩形,默认值0.

    ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0

    第九部分

    添加文本

    添加文本

    语法:

    drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]

    常用的参数值

    x:离左上角的横坐标

    y: 离左上角的纵坐标

    fontcolor:字体颜色

    fontsize:字体大小

    text:文本内容

    textfile:文本文件

    t:时间戳,单位秒

    n:帧数开始位置为0

    draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数

    简单用法

    1、在左上角添加Welcome文字

    ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom

    2、在中央添加Good day

    ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"

    3、设置字体颜色和大小

    ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"

     

    动态文本

    用 t (时间秒)变量实现动态文本

    1、顶部水平滚动

    ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"

    2、底部水平滚动

    ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"

    3、垂直从下往上滚动

    ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“

    想实现右上角显示当前时间?

     

     

    动态文本

    在右上角显示当前时间 localtime

    ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“

     

    每隔3秒显示一次当前时间

    ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"

     

    第十部分

    图片处理

    图片支持

    FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。

    截取一张图片使用 –ss(seek from start)参数.

    ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg

    从视频中生成GIF图片

    ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif

    转换视频为图片(每帧一张图)

    ffmpeg -i clip.avi frame%4d.jpg

    图片转换为视频

    ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4

     

    裁剪、填充

    和视频一样,图片也可以被裁剪和填充

    裁剪

    ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png

    填充

    ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

     

    翻转,旋转,覆盖

    和视频一样图片同样能翻转,旋转和覆盖

    翻转

    ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg

    ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg

    旋转

    ffmpeg -i image.png -vf transpose=1 image_rotated.png

    覆盖

    ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png 

    ffmpeg -f lavfi -i smptebars smpte.png 

    ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2  rgb_smpte.png

     

    第十一部分

    其他高级技巧

    屏幕录像

    显示设备名称

    ffmpeg -list_devices 1 -f dshow -i dummy

    调用摄像头

    ffplay -f dshow  -i video="Integrated Camera"

    保存为文件

    ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4

     

    添加字幕subtitles

    语法 –vf subtitles=file

     

    ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4

    视频颤抖、色彩平衡

    视频颤抖

    ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)

     

    色彩平衡

    ffplay -i jidu.mp4 -vf curves=vintage

    色彩变幻

    ffplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“

    彩色转换黑白

    ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"

    设置音频视频播放速度

    3倍视频播放视频

    ffplay -i jidu.mp4 -vf setpts=PTS/3

    ?速度播放视频

    ffplay -i jidu.mp4  -vf setpts=PTS/(3/4)

    2倍速度播放音频

    ffplay -i speech.mp3 -af atempo=2

     

    问题:视频和音频同时3/4慢速播放

    截图

    每隔一秒截一张图

    ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png

    每隔20秒截一张图

    ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

     

    注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一张图。

    多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图

    ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png

     

    马赛克视频

    马赛克视频

    用多个输入文件创建一个马赛克视频:

    ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv

     

    Logo动态移动

    1、2秒后logo从左到右移动:

    ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0

     

    2、2秒后logo从左到右移动后停止在左上角

    ffplay -i jidu.mp4  -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0

    3、每隔10秒交替出现logo。

    ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4

     

    资料

    FFmpeg官网: http://www.ffmpeg.org

    FFmpeg doc : http://www.ffmpeg.org/documentation.html

    FFmpeg wiki : https://trac.ffmpeg.org/wiki

    FAQ

    Thanks!

     

     FFmpeg基础: http://wenku.baidu.com/view/296eefcaf90f76c661371af1.html

    展开全文
  • ffmpeg中文文档

    千次阅读 2019-06-13 19:13:35
    ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ... 2描述 ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样...

    1简介

    ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

    2描述
    ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。

    ffmpeg从-i选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,并写入任意数量的输出“文件”,由普通输出URL指定。命令行中找不到的任何无法解释为选项的内容都被视为输出URL。

    原则上,每个输入或输出URL可以包含任何数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流的数量和/或类型可以受容器格式的限制。选择哪些输入将通过哪些输入自动完成或使用-map选项进行输出(请参阅流选择章节)。

    要在选项中引用输入文件,必须使用它们的索引(从0开始)。例如。第一个输入文件是0,第二个是1,等等。类似地,文件中的流由它们的索引引用。例如。 2:3指的是第三个输入文件中的第四个流。另请参阅Stream说明符章节。

    作为一般规则,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后将每次出现应用于下一个输入或输出文件。此规则的例外是全局选项(例如详细级别),应首先指定。

    不要混合输入和输出文件 - 首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。

    要将输出文件的视频比特率设置为64 kbit / s:

    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

    要强制输出文件的帧速率为24 fps:

    ffmpeg -i input.avi -r 24 output.avi

    要强制输入文件的帧速率(仅对原始格式有效)为1 fps,输出文件的帧速率为24 fps:

    ffmpeg -r 1 -i input.m2v -r 24 output.avi

    原始输入文件可能需要format选项。

    3详细说明

    ffmpeg中每个输出的转码过程可以通过下图描述:

     _______              ______________
    |       |            |              |
    | input |  demuxer   | encoded data |   decoder
    | file  | ---------> | packets      | -----+
    |_______|            |______________|      |
                                               v
                                           _________
                                          |         |
                                          | decoded |
                                          | frames  |
                                          |_________|
     ________             ______________       |
    |        |           |              |      |
    | output | <-------- | encoded data | <----+
    | file   |   muxer   | packets      |   encoder
    |________|           |______________|
    

    ffmpeg调用libavformat库(包含解复用器)来读取输入文件并从中获取包含编码数据的数据包。 当有多个输入文件时,ffmpeg会尝试通过跟踪任何活动输入流上的最低时间戳来保持它们的同步。

    然后将编码的数据包传递给解码器(除非为流选择了流复制,进一步参见说明)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过过滤进一步处理(参见下一节)。 在过滤之后,帧被传递到编码器,编码器对它们进行编码并输出编码的分组。 最后将这些传递给复用器,复用器将编码的数据包写入输出文件。

    3.1过滤
    在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成过滤器图形。 ffmpeg区分两种类型的filtergraph:简单和复杂。

    3.1.1简单滤波器图
    简单的过滤器图是那些只有一个输入和输出的过滤器图,它们都是相同的类型。 在上图中,只需在解码和编码之间插入一个额外的步骤即可表示它们:

     _________                        ______________
    |         |                      |              |
    | decoded |                      | encoded data |
    | frames  |\                   _ | packets      |
    |_________| \                  /||______________|
                 \   __________   /
      simple     _\||          | /  encoder
      filtergraph   | filtered |/
                    | frames   |
                    |__________|

    简单的过滤器图使用per-stream -filter选项配置(分别使用-vf和-af别名用于视频和音频)。 一个简单的视频过滤器图可以看起来像这样:

     _______        _____________        _______        ________
    |       |      |             |      |       |      |        |
    | input | ---> | deinterlace | ---> | scale | ---> | output |
    |_______|      |_____________|      |_______|      |________|

    请注意,某些过滤器会更改帧属性但不会更改帧内容。 例如。 上例中的fps过滤器会更改帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。

    3.1.2复杂滤波器图
    复杂滤波器图是那些不能简单地描述为应用于一个流的线性处理链的图。 例如,当图形具有多个输入和/或输出,或者输出流类型与输入不同时,就是这种情况。 它们可以用下图表示:

     _________
    |         |
    | input 0 |\                    __________
    |_________| \                  |          |
                 \   _________    /| output 0 |
                  \ |         |  / |__________|
     _________     \| complex | /
    |         |     |         |/
    | input 1 |---->| filter  |\
    |_________|     |         | \   __________
                   /| graph   |  \ |          |
                  / |         |   \| output 1 |
     _________   /  |_________|    |__________|
    |         | /
    | input 2 |/
    |_________|

    复杂滤波器图使用-filter_complex选项配置。 请注意,此选项是全局的,因为复杂的过滤器图本质上不能明确地与单个流或文件关联。

    -lavfi选项相当于-filter_complex。

    复杂滤波器图的一个简单示例是覆盖滤波器,它具有两个视频输入和一个视频输出,其中一个视频覆盖在另一个之上。 它的音频对应物是amix过滤器。

    3.2流复制
    流复制是通过将复制参数提供给-codec选项而选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和多路复用。 它对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:

     _______              ______________            ________
    |       |            |              |          |        |
    | input |  demuxer   | encoded data |  muxer   | output |
    | file  | ---------> | packets      | -------> | file   |
    |_______|            |______________|          |________|
    

    由于没有解码或编码,因此速度非常快,并且没有质量损失。但是,由于许多因素,它可能在某些情况下不起作用。应用过滤器显然也是不可能的,因为过滤器可以处理未压缩的数据。

    4流选择
    ffmpeg提供-map选项,用于手动控制每个输出文件中的流选择。用户可以跳过-map并让ffmpeg执行自动流选择,如下所述。 -vn / -an / -sn / -dn选项可用于分别跳过包含视频,音频,字幕和数据流,无论是手动映射还是自动选择,除了作为复杂滤波器图形输出的那些流。

    4.1描述
    以下子部分描述了流选择中涉及的各种规则。接下来的示例显示了这些规则在实践中的应用方式。

    虽然我们尽一切努力准确地反映程序的行为,但FFmpeg正在不断发展,自撰写本文之后,代码可能已经发生了变化。

    4.1.1自动选择流
    在没有特定输出文件的任何映射选项的情况下,ffmpeg检查输出格式以检查可以包含哪种类型的流,即。视频,音频和/或字幕。对于每个可接受的流类型,ffmpeg将从所有输入中选择一个流(如果可用)。

    它将根据以下标准选择该流:

    对于视频,它是具有最高分辨率的流,
    对于音频,它是具有最多频道的流,
    对于字幕,它是第一个找到的字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且仅选择相同类型的字幕流。
    在几个相同类型的流速率相等的情况下,选择具有最低索引的流。

    数据或附件流不会自动选择,只能使用-map包含在内。

    4.1.2手动流选择
    使用-map时,只有用户映射的流包含在该输出文件中,下面描述了filtergraph输出的一个可能的例外。

    4.1.3复杂滤波器图
    如果有任何带有未标记焊盘的复杂滤波器输出流,它们将被添加到第一个输出文件中。如果输出格式不支持流类型,则会导致致命错误。如果没有map选项,则包含这些流会导致跳过其类型的自动流选择。如果存在地图选项,则除了映射的流之外还包括这些滤波器流。

    带有标记焊盘的复杂滤波器输出流必须一次映射一次。

    4.1.4流处理
    流处理与流选择无关,下面描述的字幕除外。流处理通过-codec选项设置,该选项针对特定输出文件中的流。特别是,在流选择过程之后,ffmpeg应用编解码器选项,因此不影响后者。如果没有为流类型指定-codec选项,ffmpeg将选择输出文件muxer注册的默认编码器。

    字幕存在例外。如果为输出文件指定了字幕编码器,则将包括找到任何类型,文本或图像的第一个字幕流。 ffmpeg不验证指定的编码器是否可以转换所选的流,或者转换的流是否在输出格式中是可接受的。这通常也适用:当用户手动设置编码器时,流选择过程不能检查编码流是否可以复用到输出文件中。如果不能,则ffmpeg将中止,并且所有输出文件都将无法处理。

    4.2例子
    以下示例说明了ffmpeg的流选择方法的行为,怪癖和限制。

    他们假设以下三个输入文件。

    input file 'A.avi'
          stream 0: video 640x360
          stream 1: audio 2 channels
    
    input file 'B.mp4'
          stream 0: video 1920x1080
          stream 1: audio 2 channels
          stream 2: subtitles (text)
          stream 3: audio 5.1 channels
          stream 4: subtitles (text)
    
    input file 'C.mkv'
          stream 0: video 1280x720
          stream 1: audio 2 channels
          stream 2: subtitles (image)

    示例:自动流选择

    ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

    指定了三个输出文件,对于前两个,未设置-map选项,因此ffm​​peg将自动为这两个文件选择流。

    out1.mkv是一个Matroska容器文件,接受视频,音频和字幕流,因此ffm​​peg将尝试选择每种类型中的一种。
    对于视频,它将从B.mp4中选择stream 0,其在所有输入视频流中具有最高分辨率。
    对于音频,它将从B.mp4中选择流stream 3,因为它具有最多的通道。
    对于字幕,它将从B.mp4中选择流stream 2,这是A.avi和B.mp4中的第一个字幕流。

    out2.wav只接受音频流,因此只选择来自B.mp4的stream 3。

    对于out3.mov,由于设置了-map选项,因此不会进行自动流选择。 -map 1:一个选项将从第二个输入B.mp4中选择所有音频流。此输出文件中不包含其他流。

    对于前两个输出,将对所有包含的流进行转码。选择的编码器将是每种输出格式注册的默认编码器,可能与所选输入流的编解码器不匹配。

    对于第三个输出,音频流的编解码器选项已设置为复制,因此不会发生或可能发生解码 - 过滤 - 编码操作。所选流的数据包应从输入文件传送,并在输出文件中复用。

    示例:自动字幕选择

    ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

    尽管out1.mkv是Matroska容器文件,它接受字幕流,但只能选择视频和音频流。 C.mkv的字幕流是基于图像的,并且Matroska复用器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不选择该流。 然而,在out2.mkv中,在命令中指定字幕编码器,因此,除了视频流之外,还选择字幕流。 -an的存在禁用out2.mkv的音频流选择。

    示例:未标记的滤波器图输出

    ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

    此处使用-filter_complex选项设置过滤器图,该过滤器图由单个视频过滤器组成。 叠加滤波器只需要两个视频输入,但没有指定,因此使用前两个可用视频流,即A.avi和C.mkv。 过滤器的输出板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过自动选择视频流,这将选择B.mp4中的流。 大多数频道的音频流即。 自动选择B.mp4中的流3。 然而,没有选择字幕流,因为MP4格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。

    第二个输出文件out2.srt仅接受基于文本的字幕流。 因此,即使可用的第一个字幕流属于C.mkv,它也是基于图像的,因此被跳过。 所选择的流,B.mp4中的流2,是第一个基于文本的字幕流。

    示例:标记的filtergraph输出

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
           -map '[outv]' -an        out1.mp4 \
                                    out2.mkv \
           -map '[outv]' -map 1:a:0 out3.mkv

    上面的命令将失败,因为标记为[outv]的输出焊盘已被映射两次。 不应处理任何输出文件。

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
           -an        out1.mp4 \
                      out2.mkv \
           -map 1:a:0 out3.mkv

    上面的命令也会失败,因为色调过滤器输出有一个标签[out],并且没有被映射到任何地方。
    该命令应修改如下,

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
            -map '[outv1]' -an        out1.mp4 \
                                      out2.mkv \
            -map '[outv2]' -map 1:a:0 out3.mkv

    来自B.mp4的视频流被发送到色调过滤器,其输出使用分割滤波器克隆一次,并且两个输出都标记为。然后将每个副本映射到第一个和第三个输出文件。

    需要两个视频输入的覆盖滤波器使用前两个未使用的视频流。这些是来自A.avi和C.mkv的流。叠加输出未标记,因此无论是否存在-map选项,它都会被发送到第一个输出文件out1.mp4。

    aresample过滤器发送第一个未使用的音频流,即A.avi的音频流。由于此过滤器输出也未标记,因此它也映射到第一个输出文件。 -an的存在仅抑制音频流的自动或手动流选择,而不抑制从滤波器图发送的输出。这两个映射流都应在out1.mp4中的映射流之前进行排序。

    映射到out2.mkv的视频,音频和字幕流完全由自动流选择确定。

    out3.mkv包含来自色调过滤器的克隆视频输出和来自B.mp4的第一个音频流。

    5选项
    如果没有另外指定,所有数字选项接受表示数字作为输入的字符串,其后可以跟随SI单位前缀之一,例如:'K','M'或'G'。

    如果将“i”附加到SI单位前缀,则完整前缀将被解释为二进制倍数的单位前缀,其基于1024的幂而不是1000的幂。将“B”附加到SI单位前缀乘以这允许使用例如:'KB','MiB','G'和'B'作为数字后缀。

    不带参数的选项是布尔选项,并将相应的值设置为true。可以通过在选项名称前加上“no”来将它们设置为false。例如,使用“-nofoo”将名称为“foo”的布尔选项设置为false。

    5.1流说明符
    每个流应用一些选项,例如比特率或编解码器。流指定符用于精确指定给定选项所属的流。

    流说明符是通常附加到选项名称并通过冒号与其分隔的字符串。例如。 -codec:a:1 ac3包含a:1流说明符,匹配第二个音频流。因此,它将为第二音频流选择ac3编解码器。

    流说明符可以匹配多个流,以便将选项应用于所有流。例如。 -b:a 128k匹配所有音频流。

    空流说明符匹配所有流。例如,-codec copy或-codec: copy将复制所有流而无需重新编码。

    流说明符的可能形式是:

    stream_index
    使用此索引匹配流。例如。 -threads:1 4将第二个流的线程数设置为4.如果stream_index用作附加流说明符(见下文),则它从匹配流中选择流编号stream_index。流编号基于libavformat检测到的流的顺序,除非还指定了程序ID。在这种情况下,它基于程序中流的排序。

    stream_type[:additional_stream_specifier]
    stream_type是以下之一:视频为“v”或“V”,音频为“a”,副标题为“s”,数据为“d”,附件为“t”。 'v'匹配所有视频流,'V'仅匹配未附加图片,视频缩略图或封面艺术的视频流。如果使用additional_stream_specifier,则它匹配具有此类型并与additional_stream_specifier匹配的流。否则,它匹配指定类型的所有流。

    p:program_id[:additional_stream_specifier]
    使用id program_id匹配程序中的流。如果使用additional_stream_specifier,则它匹配两个都是程序一部分并与additional_stream_specifier匹配的流。

    #stream_id or i:stream_id
    通过流id匹配流(例如,MPEG-TS容器中的PID)。

    m:key[:value]
    使用具有指定值的元数据标记键匹配流。如果未给出value,则将包含给定标记的流与任何值匹配。

    u
    匹配具有可用配置的流,必须定义编解码器并且必须存在诸如视频维度或音频采样率之类的基本信息。

    请注意,在ffmpeg中,按元数据匹配仅适用于输入文件。

    5.2通用选项
    这些选项在ff *工具中共享。

    -L
    显示许可证。

    -h, - ?, -  help, -  help [arg]
    显示帮助。可以指定可选参数以打印关于特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。

    arg的可能值是:


    除基本工具选项外,还可以打印高级工具选项。

    充分
    打印完整的选项列表,包括编码器,解码器,分路器,复用器,滤波器等的共享和专用选项。

    解码器= decoder_name
    打印有关名为decoder_name的解码器的详细信息。使用-decoders选项获取所有解码器的列表。

    编码器= encoder_name
    打印有关名为encoder_name的编码器的详细信息。使用-encoders选项获取所有编码器的列表。

    分路= demuxer_name
    打印有关名为demuxer_name的分路器的详细信息。使用-formats选项获取所有解复用器和复用器的列表。

    复用器= muxer_name
    打印有关名为muxer_name的muxer的详细信息。使用-formats选项获取所有复用器和分路器的列表。

    滤波器= FILTER_NAME
    打印有关过滤器名称filter_name的详细信息。使用-filters选项获取所有过滤器的列表。

    -版
    显示版本。

     - 格式
    显示可用格式(包括设备)。

    -demuxers
    显示可用的解复用器。

    -muxers
    显示可用的复用器。

    -设备
    显示可用设备。

    -codecs
    显示libavcodec已知的所有编解码器。

    请注意,本文档中使用术语“编解码器”作为更正确称为媒体比特流格式的快捷方式。

    -decoders
    显示可用的解码器。

    -encoders
    显示所有可用的编码器。

    -bsfs
    显示可用的比特流过滤器。

    -protocols
    显示可用协议。

    -filters
    显示可用的libavfilter过滤器。

    -pix_fmts
    显示可用的像素格式。

    -sample_fmts
    显示可用的样本格式。

    -layouts
    显示频道名称和标准频道布局。

    -colors
    显示已识别的颜色名称

    -sources device [,opt1 = val1 [,opt2 = val2] ...]
    显示输入设备的自动检测源。某些设备可能提供无法自动检测的系统相关源名称。不能假定返回的列表总是完整的。

    ffmpeg -sources pulse,server=192.168.0.4

    -sinks device [,opt1 = val1 [,opt2 = val2] ...]
    显示输出设备的自动检测接收器。 某些设备可能提供无法自动检测的与系统相关的接收器名称。 不能假定返回的列表总是完整的。

    ffmpeg -sinks pulse,server=192.168.0.4

    -loglevel [flags +] loglevel | -v [flags +] loglevel
    设置库使用的日志记录级别和标志。

    可选的标志前缀可以包含以下值:

    'repeat'
    表示重复的日志输出不应压缩到第一行,并且将省略“最后重复消息n次”行。

    'level'
    表示日志输出应为每个消息行添加[level]前缀。这可以用作对数着色的替代方案,例如,将日志转储到文件时。

    标志也可以单独使用,添加'+'/' - '前缀来设置/重置单个标志,而不会影响其他标志或更改日志级别。设置flags和loglevel时,最后一个标志值和loglevel之间需要一个'+'分隔符。

    loglevel是一个字符串或包含以下值之一的数字:

    'quiet, -8'
    什么都不显示;安静。

    'panic, 0'
    仅显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有用于任何目的。

    'fatal, 8'
    只显示致命错误。这些是错误,在此之后该过程绝对无法继续。

    'error, 16'
    显示所有错误,包括可以从中恢复的错误。

    'warning, 24'
    显示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。

    'info, 32'
    在处理过程中显示信息性消息。这是警告和错误的补充。这是默认值。

    'verbose, 40'
    与信息相同,除了更详细。

    'debug, 48'
    显示所有内容,包括调试信息。

    'trace, 56'
    例如,要启用重复日志输出,请添加级别前缀,并将loglevel设置为verbose:

    ffmpeg -loglevel repeat+level+verbose -i input output

    另一个允许重复日志输出而不影响级别前缀标志或loglevel的当前状态的示例:

    ffmpeg [...] -loglevel +repeat

    默认情况下,程序会记录到stderr。 如果终端支持着色,则使用颜色标记错误和警告。 可以禁用日志着色设置环境变量AV_LOG_FORCE_NOCOLOR或NO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。 不推荐使用环境变量NO_COLOR,将在以后的FFmpeg版本中删除。

    -report
    将完整命令行和控制台输出转储到当前目录中名为program-YYYYMMDD-HHMMSS.log的文件。 此文件可用于错误报告。 它还意味着-loglevel调试。

    将环境变量FFREPORT设置为任何值具有相同的效果。 如果值为':' - 分隔键=值序列,则这些选项将影响报告; 如果选项值包含特殊字符或选项分隔符':',则必须对其进行转义(请参阅ffmpeg-utils手册中的“引用和转义”部分)。

    可识别以下选项:

    file
    设置用于报告的文件名; %p扩展为程序名称,%t扩展为时间戳,%%扩展为普通%

    level
    使用数值设置日志详细级别(请参阅-loglevel)。

    例如,要使用日志级别32(日志级别信息的别名)将报告输出到名为ffreport.log的文件:

    FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

    解析环境变量时的错误不是致命的,并且不会出现在报告中。

    -hide_banner
    抑制打印横幅。

    所有FFmpeg工具通常都会显示版权声明,构建选项和库版本。 此选项可用于禁止打印此信息。

    -cpuflags flags (global)
    允许设置和清除cpu标志。 此选项用于测试。 除非你知道自己在做什么,否则不要使用它。

    ffmpeg -cpuflags -sse+mmx ...
    ffmpeg -cpuflags mmx ...
    ffmpeg -cpuflags 0 ...

    此选项的可能的flag是:

    'x86'
      'mmx'
      'mmxext'
      'sse'
      'sse2'
      'sse2slow'
      'sse3'
      'sse3slow'
      'ssse3'
      'atom'
      'sse4.1'
      'sse4.2'
      'avx'
      'avx2'
      'xop'
      'fma3'
      'fma4'
      '3dnow'
      '3dnowext'
      'bmi1'
      'bmi2'
      'cmov'
    'ARM'
      'armv5te'
      'armv6'
      'armv6t2'
      'vfp'
      'vfpv3'
      'neon'
      'setend'
    'AArch64'
      'armv8'
      'vfp'
      'neon'
    'PowerPC'
      'altivec'
    'Specific Processors'
      'pentium2'
      'pentium3'
      'pentium4'
      'k6'
      'k62'
      'athlon'
      'athlonxp'
      'k8'

    5.3 AVOptions
    这些选项由libavformat,libavdevice和libavcodec库直接提供。 要查看可用AVOptions列表,请使用-help选项。 它们分为两类:

    generic
    可以为任何容器,编解码器或设备设置这些选项。 容器/设备的AVFormatContext选项和编解码器的AVCodecContext选项下列出了通用选项。

    private
    这些选项特定于给定的容器,设备或编解码器。 私有选项列在其相应的容器/设备/编解码器下。

    例如,要将ID3v2.3标头而不是默认ID3v2.4写入MP3文件,请使用MP3 muxer的id3v2_version私有选项:

    ffmpeg -i input.flac -id3v2_version 3 out.mp3

    所有编解码器AVOptions都是每个流,因此应该附加一个流说明符:

    ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4

    在上面的示例中,多声道音频流被映射两次以进行输出。 第一个实例用编解码器ac3和比特率640k编码。 将第二个实例缩混为2个通道,并使用编解码器aac进行编码。 使用输出流的绝对索引为其指定128k的比特率。

    注意:-nooption语法不能用于布尔AVOptions,请使用-option 0 / -option 1。

    注意:通过将v / a / s添加到选项名称之前指定每个流AVOptions的旧的未记录方式现在已过时,将很快删除。

    5.4主要选择
    -f fmt(输入/输出)
    强制输入或输出文件格式。 通常会自动检测输入文件的格式,并从输出文件的文件扩展名中猜测,因此在大多数情况下不需要此选项。

    -i url(输入)
    输入文件网址

    -y(glodal)
    无需询问即可覆盖输出文件。

    -n(glodal)
    不要覆盖输出文件,如果已存在指定的输出文件,请立即退出。

    -stream_loop号码(输入)
    设置输入流的循环次数。 循环0表示无循环,循环-1表示无限循环。

    -c [:stream_specifier]编解码器(输入/输出,每个流)
    -codec [:stream_specifier]编解码器(输入/输出,每个流)
    为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。 codec是解码器/编码器的名称或特殊值副本(仅输出),表示不重新编码流。

    例如

    ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

    使用libx264对所有视频流进行编码并复制所有音频流。

    对于每个流,应用最后一个匹配的c选项,因此

    ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

    将复制除第二个视频(将使用libx264编码)和第138个音频(将使用libvorbis编码)之外的所有流。

    -t duration(输入/输出)
    当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。

    当用作输出选项(在输出URL之前)时,在其持续时间达到持续时间后停止写入输出。

    duration必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    -to和-t是互斥的,-t具有优先权。

     -to position(输入/输出)
    停止写入输出或读取位置输入。 position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    -to和-t是互斥的,-t具有优先权。

    -fs limit_size(输出)
    设置文件大小限制,以字节为单位。 超出限制后不再写入更多的字节块。 输出文件的大小略大于请求的文件大小。

    -ss position (输入/输出)

    当用作输入选项(在-i之前)时,在此输入文件中寻找位置。 请注意,在大多数格式中,无法精确搜索,因此ffmpeg将在位置之前寻找最接近的搜索点。 当启用转码和-accurate_seek(默认值)时,搜索点和位置之间的这个额外段将被解码并丢弃。 在进行流复制时或使用-noaccurate_seek时,它将被保留。

    当用作输出选项(在输出URL之前)时,解码但丢弃输入,直到时间戳到达位置。

    position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    -sseof position (输入)

    与-ss选项类似,但相对于“文件结束”。 这是负值在文件中较早,0表示在EOF。

    -itsoffset offset(输入)
    设置输入时间偏移。

    offset必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    偏移量将添加到输入文件的时间戳中。指定正偏移意味着相应的流延迟了offset中指定的持续时间。

    -itsscale scale(输入,每个流)
    重新调整输入时间戳。 scale应该是一个浮点数。

    -timestamp date(输出)
    在容器中设置录制时间戳。

    date必须是日期规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)Date部分

    -metadata [:metadata_specifier] key = value(输出,每元数据)
    设置元数据键/值对。

    可以给出可选的metadata_specifier以在流,章节或程序上设置元数据。有关详细信息,请参阅-map_metadata文档。

    此选项将覆盖使用-map_metadata设置的元数据。也可以使用空值删除元数据。

    例如,要在输出文件中设置标题:

    ffmpeg -i in.avi -metadata title="my title" out.flv

    要设置第一个音频流的语言:

    ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

    -disposition [:stream_specifier] value(输出,每个流)

    设置流的处置。

    此选项会覆盖从输入流复制的处置。 也可以通过将其设置为0来删除处置。

    以下dispositions被认可:

    default
    dub
    original
    comment
    lyrics
    karaoke
    forced
    hearing_impaired
    visual_impaired
    clean_effects
    attached_pic
    captions
    descriptions
    dependent
    metadata

    例如,要将第二个音频流设为默认流:

    ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv

    要使第二个字幕流成为默认流,并从第一个字幕流中删除默认处置:

    ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv

    要添加嵌入式封面/缩略图:

    ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4

    并非所有的复用器都支持嵌入式缩略图,而且那些只支持一些格式,如JPEG或PNG。

    -program [title=title:][program_num=program_num:]st=stream[:st=stream...] (输出)

    创建具有指定标题program_num的程序,并将指定的流添加到该程序。

    -target type (输出)

    指定目标文件类型(vcd,svcd,dvd,dv,dv50)。 类型可以使用pal-,ntsc-或film-作为前缀,以使用相应的标准。 然后自动设置所有格式选项(比特率,编解码器,缓冲区大小)。 你可以输入:

    ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

    但是,只要您知道它们与标准不冲突,您就可以指定其他选项,如:

    ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg

    -dn(输入/输出)
    作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

    作为输出选项,禁用数据记录,即自动选择或映射任何数据流。有关完全手动控制的信息,请参阅-map选项。

    -dframes number(输出)
    设置要输出的数据帧数。这是-frames:d的过时别名,您应该使用它。

    -frames [:stream_specifier] framecount(输出,每个流)
    在framecount帧之后停止写入流。

    -q [:stream_specifier] q(输出,每个流)
    -qscale [:stream_specifier] q(输出,每个流)
    使用固定质量标度(VBR)。 q / qscale的含义取决于编解码器。如果在没有stream_specifier的情况下使用qscale,那么它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为2个不同的编解码器指定相同的编解码器特定值,音频和视频通常不是没有stream_specifier时的意图用来。

    -filter [:stream_specifier] filtergraph(输出,每个流)
    创建filtergraph指定的filtergraph并使用它来过滤流。

    filtergraph是要应用于流的filtergraph的描述,并且必须具有单个输入和相同类型的流的单个输出。在filtergraph中,输入与标签输入相关联,输出与标签输出相关联。有关filtergraph语法的详细信息,请参阅ffmpeg-filters手册。

    如果要创建具有多个输入和/或输出的过滤器图形,请参阅-filter_complex选项。

    -filter_script [:stream_specifier] filename(输出,每个流)
    此选项类似于-filter,唯一的区别是它的参数是要从中读取过滤器图形描述的文件的名称。

    -filter_threads nb_threads(全局)
    定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,这个线程可用于并行处理。默认值是可用CPU的数量。

    -pre [:stream_specifier] preset_name(输出,每个流)
    指定匹配流的预设。

    -stats(全球)
    打印编码进度/统计信息。默认情况下,要显式禁用它,您需要指定-nostats。

    -progress url(全局)
    将程序友好的进度信息发送到url。

    大约每秒和编码过程结束时写入进度信息。它由“key = value”行组成。 key仅包含字母数字字符。一系列进度信息的最后一个键始终是“进度”。

    -stdin
    启用标准输入的交互。默认情况下启用,除非使用标准输入作为输入。要显式禁用交互,您需要指定-nostdin。

    禁用标准输入上的交互很有用,例如,如果ffmpeg位于后台进程组中。使用ffmpeg ... </ dev / null可以获得大致相同的结果,但它需要一个shell。

    -debug_ts(全球)
    打印时间戳信息。它默认是关闭的。此选项主要用于测试和调试,输出格式可能会从一个版本更改为另一个版本,因此便携式脚本不应使用它。

    另请参阅选项-fdebug ts。

    -attach filename(输出)
    将附件添加到输出文件。这有一些格式支持,如Matroska,例如用于渲染字幕的字体。附件是作为特定类型的流实现的,因此该选项将向文件添加新流。然后可以通常的方式在此流上使用每个流选项。使用此选项创建的附件流将在所有其他流(即使用-map或自动映射创建的流)之后创建。

    请注意,对于Matroska,您还必须设置mimetype元数据标记:

    ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

    (假设附件流将在输出文件中排在第三位)。

    -dump_attachment [:stream_specifier] filename(输入,每个流)
    将匹配的附件流提取到名为filename的文件中。 如果filename为空,则将使用文件名元数据标记的值。

    例如。 提取名为'out.ttf'的文件的第一个附件:

    ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

    要提取由filename标记确定的文件的所有附件:

    ffmpeg -dump_attachment:t "" -i INPUT

    技术说明 - 附件是作为编解码器extradata实现的,因此该选项实际上可用于从任何流中提取extradata,而不仅仅是附件。

    -noautorotate
    禁用基于文件元数据自动旋转视频。

    5.5视频选项

    -vframes number(输出)
    设置要输出的视频帧数。这是-frames:v的过时别名,您应该使用它。

    -r [:stream_specifier] fps(输入/输出,每个流)
    设置帧速率(Hz值,分数或缩写)。

    作为输入选项,忽略存储在文件中的任何时间戳,而是假设帧速率fps保持不变,生成时间戳。这与某些输入格式(如image2或v4l2)使用的-framerate选项不同(在旧版FFmpeg中它曾经是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。

    作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps。

    -s [:stream_specifier] size(输入/输出,每个流)
    设置框架大小。

    作为输入选项,这是video_size private选项的快捷方式,由一些分路器识别,其帧大小未存储在文件中或者是可配置的 - 例如,原始视频或视频采集卡。

    作为输出选项,这会将scale视频滤镜插入相应滤镜图的末尾。请直接使用scale过滤器将其插入开头或其他位置。

    格式为'wxh'(默认 - 与源相同)。

    -aspect [:stream_specifier] aspect(输出,每个流)
    设置由aspect指定的视频显示宽高比。

    aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如,“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。

    如果与-vcodec副本一起使用,它将影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。

    -vn(输入/输出)
    作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

    作为输出选项,禁用视频记录,即自动选择或映射任何视频流。有关完全手动控制的信息,请参阅-map选项。

    -vcodec codec(输出)
    设置视频编解码器。这是-codec:v的别名。

    -pass [:stream_specifier] n(输出,每个流)
    选择通行证号码(1或2)。它用于进行双通视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见-passlog文件选项),在第二次传递中,该日志文件用于以精确请求的比特率生成视频。在第1阶段,您可能只是停用音频并将输出设置为null,Windows和Unix的示例:

    ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
    ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

    -passlogfile [:stream_specifier] prefix(输出,每个流)
    将两遍日志文件名前缀设置为前缀,默认文件名前缀为“ffmpeg2pass”。 完整的文件名将是PREFIX-N.log,其中N是特定于输出流的数字

    -vf filtergraph(输出)
    创建filtergraph指定的filtergraph并使用它来过滤流。

    这是-filter:v的别名,请参阅-filter选项

    5.6高级视频选项

    -pix_fmt [:stream_specifier] format(输入/输出,每个流)
    设置像素格式。使用-pix_fmts显示所有支持的像素格式。如果无法选择所选的像素格式,ffmpeg将打印警告并选择编码器支持的最佳像素格式。如果pix_fmt以+为前缀,则如果无法选择所请求的像素格式,ffmpeg将退出并显示错误,并且禁用过滤器图形内的自动转换。如果pix_fmt是单个+,则ffmpeg选择与输入(或图形输出)相同的像素格式,并禁用自动转换。

    -sws_flags flags(输入/输出)
    设置SwScaler标志。

    -rc_override [:stream_specifier] override(输出,每个流)
    特定间隔的速率控制覆盖,格式为“int,int,int”列表,用斜杠分隔。两个第一个值是开始和结束帧数,最后一个是量化器,如果是正值则使用,或者质量因子,如果是负数。

    -ilme
    强制编码器中的隔行扫描支持(仅限MPEG-2和MPEG-4)。如果您的输入文件是隔行扫描并且您希望保持隔行扫描格式以获得最小损失,请使用此选项。另一种方法是使用-deinterlace对输入流进行去隔行,但是去隔行会引入损失。

    -psnr
    计算压缩帧的PSNR。

    -vstats
    将视频编码统计信息转储到vstats_HHMMSS.log。

    -vstats_file文件
    将视频编码统计转储到文件。

    -vstats_version文件
    指定要使用的vstats格式的版本。默认值为2。

    version = 1:

    frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

    版本> 1:

    out =%2d st =%2d frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

    -top [:stream_specifier] n(输出,每个流)
    top = 1 / bottom = 0 / auto = -1 field first

    -dc precision
    Intra_dc_precision。

    -vtag fourcc / tag(输出)
    强制视频标签/ fourcc。这是-tag:v的别名。

    -qphist(global)
    显示QP直方图

    -vbsf bitstream_filter
    不推荐见-bsf

    -force_key_frames [:stream_specifier] time [,time ...](输出,每个流)
    -force_key_frames [:stream_specifier] expr:expr(输出,每个流)
    在指定的时间戳强制关键帧,更准确地说是在每个指定时间后的第一帧。

    如果参数以expr:为前缀,则字符串expr将被解释为表达式,并针对每个帧进行求值。在评估为非零的情况下强制关键帧。

    如果其中一个时间是“chapters[delta]”,则将其扩展到文件中所有章节开始的时间,移动增量,表示为以秒为单位的时间。此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在搜索点。

    例如,要在每个章节开始前的5分钟插入关键帧,加上关键帧0.1秒:

    -force_key_frames 0:05:00,chapters-0.1

    expr中的表达式可以包含以下常量:

    n
    当前处理帧的数量,从0开始

    n_forced
    强制帧的数量

    prev_forced_n
    前一个强制帧的编号,当没有强制关键帧时它是NAN

    prev_forced_t
    在前一个强制帧的时间,当没有强制关键帧时,它是NAN

    t
    当前处理帧的时间

    例如,要每5秒强制一个关键帧,您可以指定:

    -force_key_frames expr:gte(t,n_forced*5)

    要在最后一次强制时间后5秒强制关键帧,从13秒开始:

    -force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

    请注意,强制使用太多关键帧对某些编码器的先行算法非常有害:使用固定GOP选项或类似选项会更有效。

    -copyinkf [:stream_specifier](输出,每个流)
    进行流复制时,还要复制开头找到的非关键帧。

    -init_hw_device type [= name] [:device [,key = value ...]]
    使用给定的设备参数初始化名为name的类型类型的新硬件设备。如果未指定名称,则将收到“type%d”形式的默认名称。

    设备的含义和以下参数取决于设备类型:

    cuda
    device是CUDA设备的编号。

    dxva2
    device是Direct3D 9显示适配器的编号。

    vaapi
    device是X11显示名称或DRM渲染节点。如果未指定,它将尝试打开默认的X11显示($ DISPLAY),然后打开第一个DRM渲染节点(/ dev / dri / renderD128)。

    vdpau
    device是X11显示名称。如果未指定,它将尝试打开默认的X11显示($ DISPLAY)。

    qsv
    设备选择'MFX_IMPL_ *'中的值。允许的值是:

    auto
    sw
    hw
    auto_any
    hw_any
    wh2
    hw3
    hw4
    如果未指定,则使用“auto_any”。 (注意,通过创建适合平台的子设备('dxva2'或'vaapi')然后从中导出QSV设备,可能更容易实现QSV的预期结果。)

    opencl
    设备选择平台和设备作为platform_index.device_index。

    还可以使用键值对来过滤该组设备,以仅查找与特定平台或设备字符串匹配的设备。

    可用作过滤器的字符串是:

    platform_profile
    platform_version
    platform_name
    platform_vendor
    platform_extensions
    device_name
    device_vendor
    driver_version
    device_version
    device_profile
    device_extensions
    device_type

    索引和过滤器必须一起唯一地选择设备。

    例子:
    -init_hw_device opencl:0.1
    在第一个平台上选择第二个设备。

    -init_hw_device opencl:,device_name = Foo9000
    选择名称中包含字符串Foo9000的设备。

    -init_hw_device opencl:1,device_type = gpu,device_extensions = cl_khr_fp16
    在支持cl_khr_fp16扩展的第二个平台上选择GPU设备。

    -init_hw_device type [= name] @source
    初始化名为name的类型类型的新硬件设备,从名为source的现有设备派生它。

    -init_hw_device list
    列出此ffmpeg版本中支持的所有硬件设备类型。

    -filter_hw_device name
    将名为name的硬件设备传递给任何过滤器图形中的所有过滤器。这可用于设置要使用hwupload过滤器上传到的设备,或使用hwmap过滤器映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常仅在输入尚未存在于硬件帧中时才需要 - 如果是,则过滤器将从它们作为输入接收的帧的上下文中获取它们所需的设备。

    这是一个全局设置,因此所有过滤器都将接收相同的设备。

    -hwaccel [:stream_specifier] hwaccel(输入,每个流)
    使用硬件加速来解码匹配的流。 hwaccel的允许值为:

    none
    不要使用任何硬件加速(默认)。

    auto
    自动选择硬件加速方法。

    vdpau
    使用VDPAU(用于Unix的视频解码和Presentation API)硬件加速。

    dxva2
    使用DXVA2(DirectX视频加速)硬件加速。

    vaapi
    使用VAAPI(视频加速API)硬件加速。

    qsv
    使用英特尔QuickSync视频加速进行视频转码。

    与大多数其他值不同,此选项不启用加速解码(仅在选择qsv解码器时自动使用),而是加速转码,而不将帧复制到系统内存中。

    为使其工作,解码器和编码器都必须支持QSV加速,并且不得使用任何滤波器。

    如果所选的hwaccel不可用或所选解码器不支持,则此选项无效。

    请注意,大多数加速方法都是用于回放,并且不会比现代CPU上的软件解码更快。此外,ffmpeg通常需要将解码后的帧从GPU内存复制到系统内存中,从而导致性能进一步下降。因此,该选项主要用于测试。

    -hwaccel_device [:stream_specifier] hwaccel_device(输入,每个流)
    选择要用于硬件加速的设备。

    仅当指定了-hwaccel选项时,此选项才有意义。它可以引用通过名称使用-init_hw_device创建的现有设备,也可以创建新设备,就像'-init_hw_device'类型:hwaccel_device之前被调用一样。

    -hwaccels
    列出此ffmpeg构建中支持的所有硬件加速方法。

    5.7音频选项

    -frames number(输出)
    设置要输出的音频帧数。这是-frames:a的过时别名,您应该使用它。

    -ar [:stream_specifier] freq(输入/输出,每个流)
    设置音频采样频率。对于输出流,默认情况下将其设置为相应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。

    -qq q(输出)
    设置音频质量(特定于编解码器,VBR)。这是-q:a的别名。

    -ac [:stream_specifier]通道(输入/输出,每个流)
    设置音频通道的数量。对于输出流,默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。

    -an(输入/输出)
    作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

    作为输出选项,禁用音频记录,即自动选择或映射任何音频流。有关完全手动控制的信息,请参阅-map选项。

    -acodec编解码器(输入/输出)
    设置音频编解码器。这是-codec的别名:a。

    -sample_fmt [:stream_specifier] sample_fmt(输出,每个流)
    设置音频样本格式。使用-sample_fmts获取支持的样本格式列表。

    -af filtergraph(输出)
    创建filtergraph指定的filtergraph并使用它来过滤流。

    这是-filter:a的别名,请参阅-filter选项

    5.8高级音频选项

    -atag fourcc / tag(输出)
    强制音频标签/ fourcc。 这是-tag:a的别名。

    -absf bitstream_filter
    不推荐使用,请参阅-bsf

    -guess_layout_max channels(输入,每个流)
    如果某些输入通道布局未知,请尝试仅猜测它是否对应于最多指定数量的通道。 例如,2告诉ffmpeg将1声道识别为单声道,将2声道识别为立体声而不是6声道识别为5.1。 默认是总是试图猜测。 使用0禁用所有猜测。

    5.9字幕选项

    -scodec编解码器(输入/输出)
    设置字幕编解码器。 这是-codec:s的别名。

    -sn(输入/输出)
    作为输入选项,阻止文件的所有字幕流被过滤或自动选择或映射以用于任何输出。 请参阅-discard选项以单独禁用流。

    作为输出选项,禁用字幕记录,即自动选择或映射任何字幕流。 有关完全手动控制的信息,请参阅-map选项。

    -sbsf bitstream_filter
    不推荐使用,请参阅-bsf

    5.10高级字幕选项

    -fix_sub_duration
    修复字幕持续时间。 对于每个字幕,等待同一流中的下一个数据包并调整第一个数据包的持续时间以避免重叠。 对于一些字幕编解码器,尤其是DVB字幕,这是必要的,因为原始分组中的持续时间仅是粗略估计,并且结尾实际上由空字幕帧标记。 必要时未能使用此选项会导致由于非单调时间戳而导致的夸大持续时间或多路复用失败。

    请注意,此选项将延迟所有数据的输出,直到下一个字幕包被解码:它可能会大量增加内存消耗和延迟。

    -canvas_size大小
    设置用于渲染字幕的画布大小。

    5.11高级选项

    -map [ - ] input_file_id [:stream_specifier] [?] [,sync_file_id [:stream_specifier]] | [linklabel](输出)
    将一个或多个输入流指定为输出文件的源。每个输入流由输入文件索引input_file_id和输入文件中的输入流索引input_stream_id标识。两个索引都从0开始。如果指定,sync_file_id:stream_specifier设置哪个输入流用作表示同步参考。

    命令行中的第一个-map选项指定输出流0的源,第二个-map选项指定输出流1的源,等等。

    - 流标识符之前的字符创建“negative”映射。它禁用已创建映射的匹配流。

    尾随的"?"在流索引之后将允许地图是可选的:如果地图不匹配流,则将忽略地图而不是失败。请注意,如果使用无效的输入文件索引,映射仍将失败;例如,如果地图指的是不存在的输入。

    另一种[linklabel]表单将把复杂过滤器图形的输出(请参阅-filter_complex选项)映射到输出文件。 linklabel必须对应于图中定义的输出链接标签。

    例如,将所有流从第一个输入文件映射到输出

    ffmpeg -i INPUT -map 0 output

    例如,如果第一个输入文件中有两个音频流,则这些流由“0:0”和“0:1”标识。 您可以使用-map选择要放在输出文件中的流。 例如:

    ffmpeg -i INPUT -map 0:1 out.wav

    将由“0:1”标识的INPUT中的输入流映射到out.wav中的(单个)输出流。

    例如,要从输入文件a.mov(由标识符“0:2”指定)中选择索引为2的流,并从输入b.mov(由标识符“1:6”指定)中选择索引为6的流, 并将它们复制到输出文件out.mov:

    ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

    要从输入文件中选择所有视频和第三个音频流:

    ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

    要映射除第二个音频之外的所有流,请使 negative映射

    ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

    要映射来自第一个输入的视频和音频流,并使用尾随?,如果第一个输入中没有音频流,则忽略音频映射:

    ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

    要选择英语音频流:

    ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

    请注意,使用此选项会禁用此输出文件的默认映射。

    -ignore_unknown
    如果尝试复制此类流,则忽略具有未知类型的输入流而不是失败。

    -copy_unknown
    如果尝试复制此类流,则允许复制具有未知类型的输入流而不是失败。

    -map_channel [input_file_id.stream_specifier.channel_id | -1] [?] [:output_file_id.stream_specifier]
    将音频通道从给定输入映射到输出。 如果未设置output_file_id.stream_specifier,则音频通道将映射到所有音频流。

    使用“-1”而不是input_file_id.stream_specifier.channel_id将映射静音通道。

    尾随?将允许map_channel是可选的:如果map_channel不匹配任何通道,则将忽略map_channel而不是失败。

    例如,假设INPUT是立体声音频文件,您可以使用以下命令切换两个音频通道:

    ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

    如果你想静音第一个频道并保持第二个频道:

    ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT

    “-map_channel”选项的顺序指定输出流中通道的顺序。 输出通道布局是从映射的通道数量中猜出的(单声道,如果一个“-map_channel”,立体声,如果是两个,等等)。 如果输入和输出通道布局不匹配,则使用“-ac”组合“-map_channel”可以更新通道增益级别(例如两个“-map_channel”选项和“-ac 6”)。

    您还可以将输入的每个通道提取到特定输出; 以下命令将INPUT音频流(file0,stream0)的两个通道提取到相应的OUTPUT_CH0和OUTPUT_CH1输出:

    ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

    以下示例将立体声输入的通道拆分为两个单独的流,这些流被放入相同的输出文件中:

    ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg

    请注意,目前每个输出流只能包含来自单个输入流的通道; 例如,您不能使用“-map_channel”来选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并为单个输出流。 因此,例如,当前不可能将两个单独的单声道流转换成单个立体声流。 然而,将立体声流分成两个单声道单声道流是可能的。

    如果您需要此功能,可能的解决方法是使用amerge过滤器。 例如,如果您需要将媒体(此处为input.mkv)与2个单声道音频流合并为一个立体声通道音频流(并保留视频流),则可以使用以下命令:

    ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

    要从第一个输入映射前两个音频通道,并使用尾随?,如果第一个输入是单声道而不是立体声,请忽略音频通道映射:

    ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT

    -map_metadata [:metadata_spec_out] infile [:metadata_spec_in](输出,每元数据)
    从infile设置下一个输出文件的元数据信息。 请注意,这些是文件索引(从零开始),而不是文件名。 可选的metadata_spec_in / out参数指定要复制的元数据。 元数据说明符可以具有以下形式:

    g
    全局元数据,即应用于整个文件的元数据

    s [:stream_spec]
    每个流元数据。 stream_spec是Stream说明符章节中描述的流说明符。 在输入元数据说明符中,复制第一个匹配流。 在输出元数据说明符中,将所有匹配的流复制到。

    c:chapter_index
    每章元数据。 chapter_index是从零开始的章节索引。

    p:program_index
    每个程序元数据。 program_index是从零开始的程序索引。

    如果省略元数据说明符,则默认为全局。

    默认情况下,从第一个输入文件复制全局元数据,每个流和每章元数据与流/章一起复制。 通过创建相关类型的任何映射来禁用这些默认映射。 负文件索引可用于创建仅禁用自动复制的虚拟映射。

    例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:

    ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

    要反过来,即将全局元数据复制到所有音频流:

    ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

    请注意,简单0在此示例中也可以正常工作,因为默认情况下采用全局元数据。

    -map_chapters input_file_index(输出)
    将带有索引input_file_index的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从第一个输入文件复制章节,至少有一章。使用负文件索引禁用任何章节复制。

    -benchmark(全局)
    在编码结束时显示基准信息。显示实际使用的系统和用户时间以及最大内存消耗。所有系统都不支持最大内存消耗,如果不支持,通常会显示为0。

    -benchmark_all(全局)
    在编码期间显示基准信息。显示在各个步骤中使用的实际,系统和用户时间(音频/视频编码/解码)。

    -timelimit duration(全局)
    ffmpeg运行持续时间秒后退出。

    -dump(全局)
    将每个输入数据包转储到stderr。

    -hex(全局)
    转储数据包时,也会转储有效负载。

    -re(输入)
    以本机帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。此选项将减慢输入读取到输入的本机帧速率。它对于实时输出(例如直播)很有用。

    -vsync参数
    视频同步方法。出于兼容性原因,旧值可以指定为数字。必须始终将新添加的值指定为字符串。

    0,passthrough
    每个帧都以其从分路器到复用器的时间戳传递。

    1,cfr
    将复制和删除帧以实现所要求的恒定帧速率。

    2,vfr
    帧以其时间戳传递或丢弃,以防止2帧具有相同的时间戳。

    drop
    作为passthrough但是会破坏所有时间戳,使muxer根据帧速率生成新的时间戳。

    -1,auto
    根据复用器功能选择1到2之间。这是默认方法。

    注意,在此之后,复用器可以进一步修改时间戳。 例如,在启用格式选项avoid_negative_ts的情况下。

    使用-map,您可以选择应从哪个流中获取时间戳。 您可以保持视频或音频不变,并将剩余的流同步到未更改的流。

    -frame_drop_threshold parameter
    帧丢弃阈值,指定视频帧在丢弃之前可以有多少。在帧速率单位中,1.0是一帧。默认值为-1.1。一个可能的用例是在出现噪声时间戳的情况下避免使用framedrops,或者在精确时间戳的情况下提高帧丢弃精度。

    -async samples_per_second
    音频同步方法。 “拉伸/挤压”音频流以匹配时间戳,参数是音频更改的每秒最大采样数。 -async 1是一种特殊情况,其中仅校正音频流的开始而不进行任何后续校正。

    注意,在此之后,复用器可以进一步修改时间戳。例如,在启用格式选项avoid_negative_ts的情况下。

    此选项已被弃用。请改用aresample音频过滤器。

    -copyts
    不处理输入时间戳,但保留其值而不尝试清理它们。特别是,不要删除初始启动时间偏移值。

    请注意,根据vsync选项或特定的多路复用器处理(例如,如果启用了格式选项avoid_negative_ts),即使选择此选项,输出时间戳也可能与输入时间戳不匹配。

    -start_at_zero
    与copyts一起使用时,移位输入时间戳,使它们从零开始。

    这意味着使用例如-ss 50将使输出时间戳从50秒开始,无论输入文件的起始时间戳是什么。

    -copytb mode
    指定在流复制时如何设置编码器时基。 mode是一个整数数值,可以采用以下值之一:

    1
    使用分路器时基。

    时基从相应的输入分路器复制到输出编码器。当复制具有可变帧速率的视频流时,有时需要避免非单调增加时间戳。

    0
    使用解码器时基。

    时基从相应的输入解码器复制到输出编码器。

    -1
    尝试自动进行选择,以生成合理的输出。

    默认值为-1。

    -enc_time_base [:stream_specifier] timebase(输出,每个流)
    设置编码器时基。 timebase是一个浮点数,可以采用以下值之一:

    0
    根据媒体类型分配默认值。

    对于视频 - 使用1 /帧速率,用于音频 - 使用1 / samplerate。

    -1
    尽可能使用输入流时基。

    如果输入流不可用,将使用默认时基。

    >0
    使用提供的数字作为时基。

    该字段可以作为两个整数的比率(例如1:24,1:48000)或浮点数(例如0.04166,2.0833e-5)提供。

    默认值为0。

    -bitexact(输入/输出)
    为(de)muxer和(de / en)编码器启用bitexact模式

    -shortest(输出)
    最短输入流结束时完成编码。

    -dts_delta_threshold
    时间戳不连续性增量阈值。

    -muxdelay秒(输出)
    设置最大解复用 - 解码延迟。

    -muxpreload seconds(输出)
    设置初始demux-decode延迟。

    -streamid output-stream-index:new-value(output)
    将新的stream-id值分配给输出流。 应在其应用的输出文件名之前指定此选项。 对于存在多个输出文件的情况,可以将streamid重新分配给不同的值。

    例如,要将输出mpegts文件的流0 PID设置为33,将流1 PID设置为36:

    ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts

    -bsf [:stream_specifier] bitstream_filters(输出,每个流)
    设置用于匹配流的比特流过滤器。 bitstream_filters是逗号分隔的比特流过滤器列表。 使用-bsfs选项获取比特流过滤器列表。

    ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
    ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt

    -tag [:stream_specifier] codec_tag(输入/输出,每个流)
    强制标记/ fourcc用于匹配流。

    -timecode hh:mm:ssSEPff
    指定写入的时间码。 对于非丢弃时间码,SEP为':',对于丢弃,SEP为';'(或'.')。

    ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

    -filter_complex filtergraph(全局)
    定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。 对于简单图形 - 具有一个输入和一个相同类型的输出的图形 - 请参阅-filter选项。 filtergraph是filtergraph的描述,如ffmpeg-filters手册的“Filtergraph语法”部分所述。

    输入链接标签必须使用[file_index:stream_specifier]语法引用输入流(即与-map使用相同)。 如果stream_specifier匹配多个流,则将使用第一个流。 未标记的输入将连接到匹配类型的第一个未使用的输入流。

    输出链接标签用-map引用。 未标记的输出将添加到第一个输出文件中。

    请注意,使用此选项,可以仅使用没有普通输入文件的lavfi源。

    例如,在视频上叠加图像

    ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
    '[out]' out.mkv

    这里[0:v]指的是第一个输入文件中的第一个视频流,它链接到覆盖滤波器的第一个(主)输入。 类似地,第二输入中的第一视频流链接到覆盖的第二(覆盖)输入。

    假设每个输入文件中只有一个视频流,我们可以省略输入标签,所以上面相当于

    ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
    '[out]' out.mkv

    此外,我们可以省略输出标签,过滤器图形的单个输出将自动添加到输出文件中,因此我们可以简单地写

    ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

    使用lavfi颜色源生成5秒纯红色视频:

    ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv

    -filter_complex_threads nb_threads(全局)
    定义用于处理filter_complex图的线程数。与filter_threads类似,但仅用于-filter_complex图。默认值是可用CPU的数量。

    -lavfi filtergraph(全局)
    定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。相当于-filter_complex。

    -filter_complex_script filename(全局)
    此选项类似于-filter_complex,唯一的区别是它的参数是要从中读取复杂filtergraph描述的文件的名称。

    -accurate_seek(输入)
    此选项使用-ss选项启用或禁用输入文件中的准确搜索。它默认启用,因此在转码时搜索是准确的。使用-noaccurate_seek来禁用它,这可能是有用的,例如复制某些流并转码其他流时。

    -seek_timestamp(输入)
    此选项使用-ss选项启用或禁用输入文件中的时间戳搜索。默认情况下禁用它。如果启用,则-ss选项的参数将被视为实际时间戳,并且不会被文件的开始时间偏移。这仅适用于不是从时间戳0开始的文件,例如传输流。

    -thread_queue_size大小(输入)
    此选项设置从文件或设备读取时排队的最大数据包数。对于低延迟/高速率直播流,如果不及时读取数据包,则可以丢弃数据包;提高这个价值可以避免它。

    -sdp_file文件(全局)
    将输出流的sdp信息打印到文件。这允许在至少一个输出不是rtp流时转储sdp信息。 (要求至少一种输出格式为rtp)。

    -discard(输入)
    允许从流中丢弃特定的流或帧。任何输入流都可以使用全部值完全丢弃,而来自流的帧的选择性丢弃在解复用器处发生,并且不被所有解复用器支持。

    none
    不丢弃任何帧。

    default
    默认值,不丢弃任何帧。

    noref
    丢弃所有非参考帧。

    bidir
    丢弃所有双向帧。

    nokey
    丢弃除关键帧之外的所有帧。

    all
    丢弃所有帧。

    -abort_on标志(全局)
    在各种条件下停止并中止。可以使用以下标志:

    empty_output
    没有数据包传递给多路复用器,输出为空。

    -xerror(全局)
    出错时停止并退出

    -max_muxing_queue_size packets(输出,每个流)
    当转码音频和/或视频流时,ffmpeg将不会开始写入输出,直到它为每个这样的流有一个数据包。在等待这种情况发生时,其他流的数据包将被缓冲。此选项为数据包中的匹配输出流设置此缓冲区的大小。

    对于大多数用途,此选项的默认值应足够高,因此如果您确定需要,请仅触摸此选项。

    作为特殊例外,您可以使用位图字幕流作为输入:它将转换为与文件中最大视频大小相同的视频,如果没有视频则转换为720x576。请注意,这是一个实验性的临时解决方案。一旦libavfilter对字幕有适当的支持,它将被删除。

    例如,要在以MPEG-TS格式存储的DVB-T录制之上对字幕进行硬编码,将字幕延迟1秒:

    ffmpeg -i input.ts -filter_complex \
      '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
      -sn -map '#0x2dc' output.mkv

    (0x2d0,0x2dc和0x2ef分别是视频,音频和字幕流的MPEG-TS PID; 0:0,0:3和0:7也可以工作)

    5.12预设文件

    预设文件包含一系列option = value对,每行一个,指定在命令行上难以指定的选项序列。 以哈希('#')字符开头的行将被忽略,并用于提供注释。 检查FFmpeg源代码树中的预置目录以获取示例。

    有两种类型的预设文件:ffpreset和avpreset文件。

    5.12.1 ffpreset文件

    ffpreset文件使用vpre,apre,spre和fpre选项指定。 fpre选项使用预设的文件名而不是预设名称作为输入,可用于任何类型的编解码器。对于vpre,apre和spre选项,预设文件中指定的选项将应用于当前所选的与预设选项相同类型的编解码器。

    传递给vpre,apre和spre预设选项的参数根据以下规则标识要使用的预设文件:

    首先,ffmpeg在$FFMPEG_DATADIR(如果设置)和$HOME / .ffmpeg目录中搜索名为arg.ffpreset的文件,并在配置时定义的datadir(通常为PREFIX/share/ ffmpeg)或沿ffpresets文件夹中搜索按顺序在win32上执行。例如,如果参数是libvpx-1080p,它将搜索文件libvpx-1080p.ffpreset。

    如果未找到此类文件,则ffmpeg将在上述目录中搜索名为codec_name-arg.ffpreset的文件,其中codec_name是将应用预设文件选项的编解码器的名称。例如,如果您使用-vcodec libvpx选择视频编解码器并使用-vpre 1080p,那么它将搜索文件libvpx-1080p.ffpreset。

    5.12.2 avpreset文件

    avpreset文件使用pre选项指定。 它们的工作方式类似于ffpreset文件,但它们只允许特定于编码器的选项。 因此,不能使用指定编码器的选项=值对。

    当指定pre选项时,ffmpeg将在目录$AVCONV_DATADIR(如果设置)和$HOME/ .avconv中查找带有后缀.avpreset的文件,并在配置时定义的datadir中查找(通常为PREFIX / share / ffmpeg) , 以该顺序。

    首先,ffmpeg在上述目录中搜索名为codec_name-arg.avpreset的文件,其中codec_name是将应用预设文件选项的编解码器的名称。 例如,如果您使用-vcodec libvpx选择视频编解码器并使用-pre 1080p,那么它将搜索文件libvpx-1080p.avpreset。

    如果未找到此类文件,则ffmpeg将在相同目录中搜索名为arg.avpreset的文件。

    6 例子

    6.1视频和音频抓取

    如果您指定输入格式和设备,则ffmpeg可以直接获取视频和音频。

    ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

    或者使用ALSA音频源(单声道输入,卡ID 1)而不是OSS:

    ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

    请注意,在使用任何电视查看器(例如Gerd Knorr的xawtv)启动ffmpeg之前,您必须激活正确的视频源和频道。 您还必须使用标准混音器正确设置音频录制电平。

    6.2 X11抓取

    用ffmpeg via抓取X11显示器

    ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg

    0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。

    ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg

    0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。 10是x偏移,20是y偏移,用于抓取。

    6.3视频和音频文件格式转换

    任何支持的文件格式和协议都可以作为ffmpeg的输入:

    例子:

    您可以使用YUV文件作为输入:

    ffmpeg -i /tmp/test%d.Y /tmp/out.mpg

    它将使用这些文件:

    /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
    /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...

    Y文件使用U和V文件分辨率的两倍。 它们是原始文件,没有标题。 它们可以由所有体面的视频解码器生成。 如果ffmpeg无法猜测,则必须使用-s选项指定图像的大小。

    您可以从原始YUV420P文件输入:

    ffmpeg -i /tmp/test.yuv /tmp/out.avi

    test.yuv是一个包含原始YUV平面数据的文件。 每个帧由Y平面组成,接着是U和V平面,半垂直和水平分辨率。

    您可以输出到原始YUV420P文件:

    ffmpeg -i mydivx.avi hugefile.yuv

    您可以设置多个输入文件和输出文件:

    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg

    将音频文件a.wav和原始YUV视频文件a.yuv转换为MPEG文件a.mpg。

    您还可以同时进行音频和视频转换:

    ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2

    将a.wav转换为22050 Hz采样率的MPEG音频。

    您可以同时编码为多种格式,并定义从输入流到输出流的映射:

    ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2

    将a.wav转换为64 kbits的a.mp2和128 kbits的b.mp2。 '-map file:index'按输出流定义的顺序指定每个输出流使用哪个输入流。

    您可以转码解密的VOB:

    ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi

    这是一个典型的DVD翻录示例; 输入是一个VOB文件,输出一个带有MPEG-4视频和MP3音频的AVI文件。 请注意,在此命令中,我们使用B帧,因此MPEG-4流与DivX5兼容,GOP大小为300,这意味着对于29.97fps输入视频,每10秒一帧内帧。 此外,音频流是MP3编码的,因此您需要通过传递--enable-libmp3lame来启用LAME支持。 该映射对于DVD转码特别有用,以获得所需的音频语言。

    注意:要查看支持的输入格式,请使用ffmpeg -demuxers。

    您可以从视频中提取图像,也可以从许多图像中创建视频:
    用于从视频中提取图像:

    ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

    这将从视频中每秒提取一个视频帧,并将其输出到名为foo-001.jpeg,foo-002.jpeg等的文件中。图像将被重新调整以适应新的WxH值。

    如果只想提取有限数量的帧,可以将上述命令与-frames:v或-t选项结合使用,或与-ss结合使用以开始从某个时间点提取。

    要从许多图像创建视频:

    ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi

    语法foo-%03d.jpeg指定使用由填充零的三个数字组成的十进制数来表示序列号。 它与C printf函数支持的语法相同,但只有接受普通整数的格式才适合。

    导入图像序列时,-i还支持在内部扩展类似shell的通配符模式(globbing),方法是选择特定于image2的-pattern_type glob选项。

    例如,要从与glob模式匹配的文件名创建视频foo  -  * .jpeg:

    ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

    您可以在输出中放置许多相同类型的流:

    ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut

    生成的输出文件test12.nut将以相反的顺序包含输入文件中的前四个流。

    强制CBR视频输出:

    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v

    四个选项lmin,lmax,mblmin和mblmax使用'lambda'单位,但您可以使用QP2LAMBDA常数轻松转换'q'单位:

    ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext

    7另见

    ffmpeg-allffplayffprobeffmpeg-utilsffmpeg-scalerffmpeg-resamplerffmpeg-codecsffmpeg-bitstream-filtersffmpeg-formatsffmpeg-devicesffmpeg-protocolsffmpeg-filters

     

    英文文档地址:http://www.ffmpeg.org/ffmpeg.html#Options

     

    展开全文
  • ffmpeg开发手册

    2015-10-10 17:29:20
    ffmpeg技术开发手册,源码简单讲解,本人尚未研究
  • ffmpeg中文手册.7z

    2019-12-02 11:25:43
    ffmpeg中文手册,官方操作说明,对于音视频研究的朋友,是必备的资料,希望对你的学习工作有所帮助。
  • FFmpeg

    2018-06-15 10:41:10
    FFmpeg安装https://blog.csdn.net/chy466071353/article/details/54949221FFmpeg视频帧图https://jingyan.baidu.com/article/15622f243a995afdfcbea521.html
  • FFmpeg4.0 中文文档

    2018-12-13 14:59:49
    FFmpeg4.0 中文文档 目录 1 概要 2 描述 3 详细描述 3.1 过滤器 3.1.1 简单过滤器 3.1.2 复杂过滤器 3.2 文件流复制 4 文件流选择 5 选项 5.1 文件流说明符 5.2 通用选项 5.3 AV选项 5.4 主要选项 5.5 视频选项 5.6 ...
  • ffmpeg tutorial中文手册

    2013-11-24 08:54:20
    ffmpeg tutorial中文手册:翻译比较详细准确,可以作为ffmpeg开发参考
  • FFMPEG使用手册

    2013-04-07 16:26:02
    FFMPEG使用手册
  • FFmpeg命令使用手册

    千次阅读 2017-10-30 09:36:01
    前言:FFmpeg是用于转换音频和视频文件的非常强大和通用的命令行工具。它是免费的,适用于Windows,Mac和Linux机器。无论您要加入两个视频文件,从视频文件中提取音频组件,将视频转换为动画GIF,FFmpeg可以做到这...
  • FFMPEG开发及使用的稀缺资源英文原版,详细介绍了FFMPEG的下载,转换,编解码,转码等所有功能的使用,各参数的说明等等。其中也介绍了音视频基础知识,为多媒体,网络流媒体开发者的非常好的使用手册
  • FFMpeg SDK 开发手册

    2013-09-23 14:05:34
    FFMpeg SDK 开发手册 视频编解码过程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,770
精华内容 1,108
关键字:

ffmpeg手册

友情链接: microcontroller.rar