• FFmpeg命令行转码

    2018-05-21 20:14:48
    本文主要了解FFmpeg进行音视频编码转换。主要学习如下几个知识点: FFmpeg使用libx264进行H,264(AVC)软...了解音视频编解码对资源使用情况分析 FFmpeg软编码H.264和H.265 支持H.264的封装格式的文件格式有很...

    本文主要了解FFmpeg进行音视频编码转换。主要学习如下几个知识点:

    • FFmpeg使用libx264进行H,264(AVC)软编码,使用libx265进行H.265(HEVC)软编码
    • 使用FFmpeg在MacOS环境下硬编码
    • 了解音频编码,MP3,AAC的参数设置编码

    FFmpeg软编码H.264和H.265

    支持H.264的封装格式的文件格式有很多,例如FLV,MP4,HLS,TS等。FFmpeg本身不支持H.264的编码器,通过第三方库x264或者OpenH264来支持,但是OpenH264开源较晚,所以多数使用的还是x264,可以通过命令行ffmpeg -h encoder=libx264来查看x264编码的一些基本信息和参数情况。

    H.264编码实例

    通过上面的-h命令查看x264支持的参数真的很多,我们在要用到优化的时候可以仔细了解其参数的含义,下面的几个实例列出了一些参数的使用,简单的了解参数的含义以及使用方法。每一个参数都可以带很多不同的配置,在使用的时候查看文档

    编码器预设参数preset

    这个参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。

    使用H.264转码文件

    ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4

    输出关键速度信息




    多了一个参数-preset ultrafast 中的ultrafast表示使用最快的编码方式,默认的编码速度是medium模式的,来查看这两种模式生成的输出信息差异。

    ffmpeg -i input.mp4 -vcodec libx264 -preset medium -b:v 2000k output.mp4




    上面的ultrafast速度是41.1倍,使用medium速度是6。24倍但是生成的视频的画质速度低的会好一些,

    编码优化参数tune

    这个参数配合视频类型和视觉优化的参数。可选项

    • film:电影真人类型
    • animation:动画
    • grain:需要保留大量的grain
    • stillimage:静态图像编码时使用
    • psnr:提高psnr做了优化的参数
    • ssim:提高ssim做了优化参数
    • fastdecode:可以快速解码的参数
    • zerolatency:零延迟,用在需要非常低的延迟的情况,比如电视电话会议编码。
    ffmpeg -i input.mp4 -vcodec libx264 -tune zerolatency -b:v 2000k output.mp4

    profile和level设置

    profile和level的设置和H.264标准文档ISO-14496-Part10描述的profile和level信息基本相同。profile有如下选项:

    • Baseline
    • Extented
    • Main
    • High
    • High10
    • High422
    • High444
      profile设置信息不同会影响编码出来的视频的很多参数不同。例如是否支持I与P分片。level也会影响很多参数,例如最大解码速度不同。

    下面使用baseline profile和high profile编码一个H.264视频,分析两个编码出来的文件的区别。有一个知识我们提取了解一下baseline profile编码出来额视频不会包含B帧,而high profile包含B帧,下面就看它们B帧的差别

    ffmpeg -i input.mp4 -vcodec libx264 -profile:v baseline -level 3.1 -s 352x288 -an -y -t 10 ouput_baseline.ts
    ffmpeg -i input.mp4 -vcodec libx264 -profile:v high -level 3.1 -s 352x288 -an -y -t 10 ouput_high.ts

    生成了两个文件,通过ffprobe来查看包含B帧的信息

    ffprobe -v quiet -show_frames -select_streams v output_baseline.ts |grep "pict_type=B"|wc -l

    输出0

    ffprobe -v quiet -show_frames -select_streams v output_high.ts |grep "pict_type=B"|wc -l

    输出161
    验证了我们的理论baseline profile包含0个B帧,而high profile包含B帧。在进行实时流媒体直播时,使用包含B帧的编码更可靠些;适当加入B帧可以有效降低码率

    sc_threshold

    FFmpeg可以通过参数-g设置帧数间隔为GOP的长度,但是遇到场景切换的时候,从一个画面突然变为另一个画面时,会强行插入一个关键帧,这时GOP的长度会重新开始。可以通过参数sc_threshold决定是否在场景切换的时候插入关键帧。
    执行命令控制编码时GOP的大小。

    ffmpeg -i input.mp4 -c:v libx264 -g 50 -t 60 output.mp4

    执行完毕后生成的文件每50帧被设置为一个GOP间隔。
    通过软件Elecrd StreamEye查看帧信息如下:




    可以看到红色框框框起来的两个I帧间隔很短,因为插入的I帧和前面的画面完全不同

    看到有些GOP的间距很短,这是因为强行插入了GOP导致的,为了使GOP的插入更加均匀,使用sc_threshold设置一下:

    ffmpeg -i input.mp4 -c:v libx264 -g 50 -sc_threshold 0 -t 60 output.mp4

    再看GOP的帧信息如下:




    拖动下面的滚动条没有发现和上面一样相隔很近的两个I帧了。

    x264opts

    由于FFmpeg设置x264参数时增加的参数比较多,FFmpeg开放了x264opts,可以通过这个参数设置x264的内部私有参数,如设置IBP帧的顺序以及规律。下面列举在上面生成的GOP文件数据分析基础上控制生成的文件不出现B帧,只要设置x264内部参数bframes=0即可:

    ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=0" -g 50 -sc_threshold 0 -t 60 output.mp4

    通过StreamEye查看Stream信息没有出现B帧



    如果希望控制I帧P帧B帧的频率和规律,可以通过控制GOP中B帧的帧数来实现,P帧的频率可以通过x264的参数b-adapt进行设置。
    例如设置GOP中,每2个P帧之间存放3个B帧:

    ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=3:b-adapt=0" -g 50 -sc_threshold 0 -t 60 output.mp4

    看看分析:



    nal-hrd

    编码可以设置VBR,CBR的编码模式,VBR为可变码率,CBR为恒定码率。互联网上VBR居多,但是我们可以使用FFmpeg制作CBR码率视频。

    ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 -t 60 output.ts

    命令执行参数介绍

    • 设置B帧个数,每两个P帧之间包含10个B帧
    • 设置视频码率为1000kbit/s
    • 设置最大码率为1000kbit/s
    • 设置最小码率为1000kbit/s
    • 设置编码的buffer大小为50KB
    • 设置H.264的编码HRD信号为CBR
    • 设置每50帧一个GOP
    • 设置场景切换不强行插入关键帧
    • 设置视频输出时间为60s

    可以通过工具Bitrate Viewer查看码率波动,我就没试了,通过Elecard StreamEye查看流信息的bitrate type为CBR。

    FFmpeg硬编解码

    以前都不知道FFmpeg可以硬编解码,以为它就只能软编解码,它真的强大。FFmpeg可以在Nvidia GPU,Intel QSV,树莓派,OS X系统下硬编解码。我使用的是OS X系统,所以下面来实验一个在该系统的硬编解码。

    OS X系统硬编解码

    直接看一个硬转码的实例,先把一个视频通过h264_vda硬解码,然后通过h264_videotoolbox硬编码视频文件。

    ffmpeg -vcodec h264_vda -i input.mp4 -vcodec h264_videotoolbox -b:v 2000k output.mp4

    结果出现错误如下:




    这个错误可清楚的知道是没有安装h264_vda工具库,在前面的文章我们知道如何重新给本机的FFmpeg带参数安装一些我们要使用的库了。但是我找了可以带的–with参数,不知道解码器h264_vda属于哪个库里面的。//todo

    FFmpeg输出MP3

    编码MP3使用编码器libmp3lame这个库,通过命令ffmpeg -h encoder=libmp3lame可以查看它的一些参数信息。
    先来看最简单的一条命令使用libmp3lame来进行音频文件编码为MP3文件。

    ffmpeg -i input -acodec libmp3lame output.mp3

    输出的码率类型参数设置

    • VBR:编码码率不断变化,通过参数-q:a设置
    • CBR:码率几乎不变,通过参数-b设置
    • ABR:平均码率是上面两个的结合体,使用它的参数编码速度比VBR高,质量比VBR差一点,比CBR质量好点,通过参数-abr来设置

    控制码率的参数为-q:a后面带数字

    FFmpeg输出AAC

    AAC是一种比MP3的编码效率更高,编码音质更好的音频编码格式,常见的使用AAC编码后的文件存储格式为m4a。FFmpeg可以使用如下三种编码器

    • aac:FFmpeg自带的AAC编码
    • libfaac:第三方AAC编码器
    • libfdk_aac:第三方AAC编码器

    FFmpeg使用AAC编码器

    看下面最简单的例子:

    ffmpeg -i input.mp4 -c:a aac -b:a 160k output.aac

    同样可以使用-q:a带数值代表的码率信息进行转换

    展开全文
  • 1、ffmpeg使用语法 命令格式:  ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]  ffmpeg [[options][`-i' input_file]]... {[options] output_file}...  1、参数选项:  (1) -an: 去掉...

    1、ffmpeg使用语法

    命令格式:
        ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
        ffmpeg [[options][`-i' input_file]]... {[options] output_file}...
        1、参数选项:
        (1) -an: 去掉音频
        (2) -acodec: 音频选项, 一般后面加copy表示拷贝
        (3) -vcodec:视频选项,一般后面加copy表示拷贝
        2、格式:
        (1) h264: 表示输出的是h264的视频裸流
        (2) mp4: 表示输出的是mp4的视频
        (3)mpegts: 表示ts视频流
        如果没有输入文件,那么视音频捕捉(只在Linux下有效,因为Linux下把音视频设备当作文件句柄来处理)就会起作用。作为通用的规则,选项一般用于下一个特定的文件。如果你给 –b 64选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。(by ternence.hsu)


    2、视频转换

    H264视频转ts视频流

    ffmpeg -i test.h264 -vcodec copy -f mpegts test.ts



    H264视频转mp4

    ffmpeg -i test.h264 -vcodec copy -f mp4 test.mp4



    ts视频转mp4

    ffmpeg -i test.ts -acodec copy -vcodec copy -f mp4 test.mp4
    mp4视频转flv
    ffmpeg -i test.mp4 -acodec copy -vcodec copy -f flv test.flv 


    转换文件为3GP格式 

    ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144 -acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp



    转换文件为3GP格式 v2

    ffmpeg -y -i test.wmv -ac 1 -acodec libamr_nb -ar 8000 -ab 12200 -s 176x144 -b 128 -r 15 test.3gp



    使用 ffmpeg 编码得到高质量的视频

    ffmpeg.exe -i "D:\Video\Fearless\Fearless.avi" -target film-dvd -s 720x352 -padtop 64 -padbottom 64 -maxrate 7350000 -b 3700000 -sc_threshold 1000000000 -trellis -cgop -g 12 -bf 2 -qblur 0.3 -qcomp 0.7 -me full -dc 10 -mbd 2 -aspect 16:9 -pass 2 -passlogfile "D:\Video\ffmpegencode" -an -f mpeg2video "D:\Fearless.m2v"



    转换指定格式文件到FLV格式

    ffmpeg.exe -i test.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv 
    ffmpeg.exe -i test.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv



    转码解密的VOB

    ffmpeg -i snatch_1.vob -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 -acodec mp3 -ab 128 snatch.avi

    (上面的命令行将vob的文件转化成avi文件,mpeg4的视频和mp3的音频。注意命令中使用了B帧,所以mpeg4流是divx5兼容的。GOP大小是300意味着29.97帧频下每10秒就有INTRA帧。该映射在音频语言的DVD转码时候尤其有用,同时编码到几种格式并且在输入流和输出流之间建立映射)


    转换文件为3GP格式

    ffmpeg -i test.avi -y -b 20 -s sqcif -r 10 -acodec amr_wb -ab 23.85 -ac 1 -ar 16000 test.3gp

    (如果要转换为3GP格式,则ffmpeg在编译时必须加上–enable-amr_nb –enable-amr_wb,详细内容可参考:转换视频为3GPP格式)


    转换文件为MP4格式(支持iPhone/iTouch)

    ffmpeg  -y  -i input.wmv  -f mp4 -async 1-s 480x320  -acodec libfaac -vcodec libxvid  -qscale 7 -dts_delta_threshold 1 output.mp4
    ffmpeg  -y  -i source_video.avi input -acodec libfaac -ab 128000 -vcodec mpeg4 -b 1200000 -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4



    将一段音频与一段视频混合

    ffmpeg -i son.wav -i video_origine.avi video_finale.mpg



    将一段视频转换为DVD格式

    ffmpeg -i source_video.avi -target pal-dvd -ps 2000000000 -aspect 16:9 finale_video.mpeg

    (target pal-dvd : Output format ps 2000000000 maximum size for the output file, in bits (here, 2 Gb) aspect 16:9 : Widescreen)


    转换一段视频为DivX格式

    ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi



    Turn X images to a video sequence

    ffmpeg -f image2 -i image%d.jpg video.mpg

    (This command will transform all the images from the current directory (named image1.jpg, image2.jpg, etc...) to a video file named video.mpg.)


    Turn a video to X images

    ffmpeg -i video.mpg image%d.jpg

    (This command will generate the files named image1.jpg, image2.jpg, ... ;The following image formats are also availables : PGM, PPM, PAM, PGMYUV, JPEG, GIF, PNG, TIFF, SGI.)


    使用ffmpeg录像屏幕(仅限Linux平台)

    ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s 1024x768 ~/test.avi

    (-vd x11:0,0 指录制所使用的偏移为 x=0 和 y=0,-s 1024×768 指录制视频的大小为 1024×768。录制的视频文件为 test.avi,将保存到用户主目录中;如果你只想录制一个应用程序窗口或者桌面上的一个固定区域,那么可以指定偏移位置和区域大小。使用xwininfo -frame命令可以完成查找上述参数。)


    重新调整视频尺寸大小(仅限Linux平台)

    ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi



    把摄像头的实时视频录制下来,存储为文件(仅限Linux平台)

    ffmpeg  -f video4linux -s 320*240 -r 10 -i /dev/video0 test.asf



    使用ffmpeg压制H.264视频

    ffmpeg -threads 4 -i INPUT -r 29.97 -vcodec libx264 -s 480x272 -flags +loop -cmp chroma -deblockalpha 0 -deblockbeta 0 -crf 24 -bt 256k -refs 1 -coder 0 -me umh -me_range 16 -subq 5 -partitions parti4x4+parti8x8+partp8x8 -g 250 -keyint_min 25 -level 30 -qmin 10 -qmax 51 -trellis 2 -sc_threshold 40 -i_qfactor 0.71 -acodec libfaac -ab 128k -ar 48000 -ac 2 OUTPUT

    (使用该指令可以压缩出比较清晰,而且文件转小的H.264视频文件)


    3、网络推送

    udp视频流的推送
    ffmpeg -re  -i 1.ts  -c copy -f mpegts   udp://192.168.0.106:1234


    4、视频拼接

    裸码流的拼接,先拼接裸码流,再做容器的封装
    ffmpeg -i "concat:test1.h264|test2.h264" -vcodec copy -f h264 out12.h264


    5、图像相关

    截取一张352x240尺寸大小的,格式为jpg的图片 

    ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg



    把视频的前30帧转换成一个Animated Gif 

    ffmpeg -i test.asf -vframes 30 -y -f gif a.gif



    截取指定时间的缩微图,-ss后跟的时间单位为秒 

    ffmpeg -i test.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 test.jpg


    6、音频处理

    转换wav到mp2格式

    ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0

    (上面的命令行转换一个64Kbits 的a.wav到128kbits的a.mp2 ‘-map file:index’在输出流的顺序上定义了哪一路输入流是用于每一个输出流的。)
    展开全文
  • 264 to yuv: ffmpeg -i transcodeV.264 -c:v rawvideo -pix_fmt yuv420p out.yuv yuv to 264: ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 720*576 -r 25 -i out.yuv -c:v libx264 -f rawvideo output.264

    264 to yuv: ffmpeg -i transcodeV.264 -c:v rawvideo -pix_fmt yuv420p out.yuv

    yuv to 264: ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 720*576 -r 25 -i out.yuv -c:v libx264 -f rawvideo output.264

    展开全文
  • ffmpeg命令行工具

    2018-07-26 09:29:16
    对于ffmpeg命令行的使用 之前一直都是通过百度(惭愧),一边找 一边用 感觉写起来比较麻烦 就在这记录下 方便以后温习 我们都知道从官网下来的可以直接运行的程序有三个 一个是ffmpeg.exe ffplay.exe ...

    对于ffmpeg命令行的使用  之前一直都是通过百度(惭愧),一边找 一边用   感觉写起来比较麻烦 就在这记录下  方便以后温习

    我们都知道从官网下来的可以直接运行的程序有三个  一个是ffmpeg.exe  ffplay.exe   ffprobe.exe

    关于ffmpeg的官网里边  一般是提供三种(static  shared  dev)  

    第一个static是提供了之前说的那三个程序   并且人家把各个dll集成了进去  导致程序的大小比较大

    第二个shared  也提供了那三个程序  只不过大小就小得多  因为它还提供了各种dll

    第三个就完全适用于开发人员  提供了lib以及头文件

     

    这边我们就直接来说说提供的那三个程序怎么用(直接点是没用的哈   直接在命令行里边用就好)

    ffmpeg是用来转码的工具  ffplay是用来播放的  ffprobe是用来查看文件格式的

     

    **************************************************************************************************************************************

    首先我们来看下ffmpeg

    http://ffmpeg.org/ffmpeg.html   官方说明

    我自己输入  ffmpeg -h

    首先会显示ffmpeg的版本  以及编译这个用的GCC的版本  以及编译之前configure的选项   之后就是依赖各种库的版本

    基本的信息显示完了以后  就会告诉你怎么使用

    usage: ffmpeg [options]  [[infile options] -i infile]... {[outfile options] outfile}...

    当然我们也可以活用help信息

    Getting help:

        -h      -- print basic options    会打印基本的选项

        -h long -- print more options  会打印更多的选项

        -h full -- print all options (including all format and codec specific options, very long)  打印所有的选项(包括所有格式和编解码器特定选项,很长)

        -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter  可以打印指定的选项

        See man ffmpeg for detailed description of the options.   当然了你要想看得仔细  有关选项的详细描述,请参阅man ffmpeg。

     

    下面我们就来看看各个选项(之后再来一个个试)

    Print help / information / capabilities:

    -L                  show license  

    -h topic            show help

    -? topic            show help

    -help topic         show help

    --help topic        show help

    -version            show version

    -buildconf          show build configuration

    -formats            show available formats                                            显示所支持的格式

    -muxers             show available muxers                                            显示所有可用的封装格式

    -demuxers           show available demuxers                                      显示所有可用的解封装格式

    -devices            show available devices                                             显示支持的设备(这里显示的只是很大的范围  并不会显示具体的设备  比如我输入ffmpeg -devices   只会像是下面输出的那样)

                           Devices:

                           D. = Demuxing supported  可以理解为输入设备(我们可以这么理解  解封装是获取流  这个设备其实干的也是获取流的事)

                           .E = Muxing supported    可以理解为输出设备(同理  输出设备是使用流的  和封装类似)

                            --

                            E caca            caca (color ASCII art) output device

                           D  dshow           DirectShow capture

                            D  lavfi           Libavfilter virtual input device

                             E sdl,sdl2        SDL2 output device

                            D  vfwcap          VfW video capture

    -codecs             show available codecs                                             显示支持的编解码器(看清楚   是编解码器)

                            需要注意的就是前面的那些什么    D,E,V,A,S,I,L,S的一类的意思

                                       D..... = Decoding supported   解码

                                       .E.... = Encoding supported     编码

                                        ..V... = Video codec                 视频

                                       ..A... = Audio codec                 音频

                                       ..S... = Subtitle codec               字幕

                                      ...I.. = Intra frame-only codec  帧内编解码器

                                      ....L. = Lossy compression        有损

                                      .....S = Lossless compression    无损

    -decoders           show available decoders                                        显示支持的解码器

    -encoders           show available encoders                                        显示支持的编码器

    -bsfs               show available bit stream filters                                 显示可用的比特流过滤器

    -protocols          show available protocols                                        显示支持的协议

    -filters            show available filters                                                   显示可用的过滤器(需要注意下下面的几个的意思   现在我还是没有搞懂什么意思   要去找找代码看看了)

                            Filters:

                               T.. = Timeline support

                               .S. = Slice threading

                               ..C = Command support

                              A = Audio input/output

                             V = Video input/output

                             N = Dynamic number and/or type of input/output

                             | = Source or sink filter

    -pix_fmts           show available pixel formats                                    显示可用像素格式

                           Pixel formats:

                            I.... = Supported Input  format for conversion        支持转换的输入格式

                           .O... = Supported Output format for conversion    支持的转换输出格式

                            ..H.. = Hardware accelerated format                       硬件加速格式

                              ...P. = Paletted format                                              调色格式

                             ....B = Bitstream format                                            位流格式

                            下面这个是输出的格式

            FLAGS NAME  (标志名称)NB_COMPONENTS (组成数量  yuv420  就是有三个组成的)        BITS_PER_PIXEL(每个像素占得位数)

    -layouts            show standard channel layouts                                显示标准通道布局  

    -sample_fmts        show available audio sample formats                    显示可用的音频示例格式

    -colors             show available color names                                         显示可用颜色名称

    -sources device     list sources of the input device                              列出输入设备的源(这个  还不清楚怎么用   到时看看官方文档)

    -sinks device       list sinks of the output device                                  列出输出设备的接收器

    -hwaccels           show available HW acceleration methods                显示可用的硬件加速方法

     

    Global options (affect whole program instead of just one file:       全局选项-----影响整个程序,而不仅仅是一个文件:

    -loglevel loglevel  set logging level          设定log等级    "quiet" "panic" "fatal" "error" "warning" "info" "verbose" "debug" "trace"

                补充说明: 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.

                       意思就是----还可以单独使用标志,添加‘+’/‘-’前缀来设置/重置单个标志,而不影响其他标志或更改日志级别。当同时设置标志和日志级别时,需要在最后一个标志值之间和日志级别之前使用。   

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

    -v loglevel         set logging level                                                                                                   和上面一样的

    -report             generate a report                                                                                                   生成报表

    -max_alloc bytes    set maximum size of a single allocated block                                                 设置单个分配块的最大大小

    -y                  overwrite output files                                                                                                覆盖输出文件

    -n                  never overwrite output files                                                                                     永远不要覆盖输出文件

    -ignore_unknown     Ignore unknown stream types                                                                      忽略未知流类型

    -filter_threads     number of non-complex filter threads                                                                非复杂过滤线程数 (后边要加数字)

    -filter_complex_threads  number of threads for -filter_complex                                                    过滤器复合体的线程数 (后边要加数字)

    -stats              print progress report during encoding                                                                    在编码期间打印进度报告

    -max_error_rate ratio of errors (0.0: no errors, 1.0: 100% error  maximum error rate                    错误率(0:无错误,1:100%错误最大错误率)

    -bits_per_raw_sample number  set the number of bits per raw sample                                        设置每个原始样本的位数

    -vol volume         change audio volume (256=normal)                                                                   改变音频音量(256=正常)

     

    Per-file main options:    每个文件的主要选项

    -f fmt              force format                                                                强迫使用格式‘fmt’

    -c codec            codec name

    -codec codec        codec name

    -pre preset         preset name          预先设定名称                                         

    -map_metadata outfile[,metadata]:infile[,metadata]  set metadata information of outfile from infile         依据输入文件设置输出文件的元数据信息

    -t duration         record or transcode "duration" seconds of audio/video        编码或转码音频/视频的“ duration”秒

    -to time_stop       record or transcode stop time                 记录或转码停止时间

    -fs limit_size      set the limit file size in bytes               设置限制文件大小(以字节为单位)

    -ss time_off        set the start time offset                设置起始时间偏移量

    -sseof time_off     set the start time offset relative to EOF                    设置相对于eof的起始时间偏移量。

    -seek_timestamp     enable/disable seeking by timestamp with -ss                  使用-ss启用/禁用时间戳查找

    -timestamp time     set the recording timestamp ('now' to set the current time)                   设置录制时间戳(“立即”设置当前时间)

    -metadata string=string  add metadata                        添加元数据

    -program title=string:st=number...  add program with specified streams               添加具有指定流的程序

    -target type        specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")                             指定目标文件类型( "vcd", "svcd", "dvd", "dv" or "dv50",可选前缀为 "pal-", "ntsc-" or "film-")

    -apad               audio pad                  音频垫

    -frames number      set the number of frames to output                将帧数设置为输出

    -filter filter_graph  set stream filtergraph                   设置流滤波器

    -filter_script filename  read stream filtergraph description from a file         从文件中读取流过滤图描述

    -reinit_filter      reinit filtergraph on input parameter changes              输入参数变化的 reinit滤波图

    -discard            discard                         丢弃

    -disposition        disposition                              配置

     

    Video options:   视频选项

    -vframes number     set the number of video frames to output                         设置输出视频的帧数

    -r rate             set frame rate (Hz value, fraction or abbreviation)                      设置帧速率(Hz值、分数或缩写)

    -s size             set frame size (WxH or abbreviation)                                           设置帧大小(WXH或缩写——Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576)

    -aspect aspect      set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)                          设定高宽比(4:3,16:9或1.3333,1.7777)

    -bits_per_raw_sample number  set the number of bits per raw sample             设置每个原始样本的位数。

    -vn                 disable video                                                                                  禁用视频

    -vcodec codec       force video codec ('copy' to copy stream)                            强制视频编解码器(“复制流)

    -timecode hh:mm:ss[:;.]ff  set initial TimeCode value.                                         设置初始时间码值

    -pass n             select the pass number (1 to 3)                                                   选择通行证号码(1到3)

    -vf filter_graph    set video filters                                                                         设置视频滤波器

    -ab bitrate         audio bitrate (please use -b:a)                                                   音频比特率(请使用-b:a)

    -b bitrate          video bitrate (please use -b:v)                                                    视频比特率(请使用-b:v)

    -dn                 disable data                                                                                   禁用数据

     

    Audio options:   音频选项    

    -aframes number     set the number of audio frames to output                         设置输出音频流的帧数

    -aq quality         set audio quality (codec-specific)                                              设置音频质量(特定编解码器)

    -ar rate            set audio sampling rate (in Hz)                                                    设置音频采样率(以赫兹为单位)

    -ac channels        set number of audio channels                                                 设置音频通道数

    -an                 disable audio                                                                                  禁用音频

    -acodec codec       force audio codec ('copy' to copy stream)                            强制音频编解码器(“复制流)

    -vol volume         change audio volume (256=normal)                                       改变音频音量(256=正常)

    -af filter_graph    set audio filters                                                                        设置音频过滤器

     

    Subtitle options:   字幕选项

    -s size             set frame size (WxH or abbreviation)                                           设置帧大小(WxH或省略)

    -sn                 disable subtitle                                                                               禁用字幕

    -scodec codec       force subtitle codec ('copy' to copy stream)                         强制字幕编解码器(“复制流)

    -stag fourcc/tag    force subtitle tag/fourcc                                                        强制字幕标签/fourcc码

    -fix_sub_duration   fix subtitles duration                                                             修正字幕持续时间

    -canvas_size size   set canvas size (WxH or abbreviation)                                   设置画布大小(WXH或缩写)

    -spre preset        set the subtitle options to the indicated preset                       将字幕选项设置为指定的预置

     

    好了   我们就开始用实例进行巩固

    ffmpeg -i cyq.avi  out.avi  

    这个是最简单的转码命令   转码的内部参数都是取的默认值

    我们来看下相关的参数

    后来才意识到之前为什么会写错  现在  我们再来重温一遍ffmpeg的书写格式

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

    ffmpeg  +  全局的选项(可省略)+{输入文件选项  -i 文件} +{输出文件选项  文件}

     

     

     

     

    **************************************************************************************************************************************

     

    ffplay  是用SDL来写的一个播放器 

    (官方的解释:ffplay是一个非常简单和可移植的媒体播放器,使用ffmpeg库和SDL库。它主要用作各种ffmpeg API的测试床。)

    他的功能可谓是很强大  但是就是没有图形化的操作界面  只能通过键盘来操作

    这边就分  快捷键以及选项来进行说明

    http://ffmpeg.org/ffplay.html   官网的使用说明

    我们先来看下ffplay -h

    因为显示的东西太多  我这边就来挑选着记录

    前边显示的和ffmpeg的差不多

    我们先看下他的用法:ffplay [options] input_file

    接下来看下主选项:

    Main options:

    -L                  show license

    -h topic            show help

    -? topic            show help

    -help topic         show help

    --help topic        show help

    -version            show version

    -buildconf          show build configuration

    -formats            show available formats

    -muxers             show available muxers

    -demuxers           show available demuxers

    -devices            show available devices

    -codecs             show available codecs

    -decoders           show available decoders

    -encoders           show available encoders

    -bsfs               show available bit stream filters

    -protocols          show available protocols

    -filters            show available filters

    -pix_fmts           show available pixel formats

    -layouts            show standard channel layouts

    -sample_fmts        show available audio sample formats

    -colors             show available color names

    -loglevel loglevel  set logging level

    -v loglevel         set logging level

    -report             generate a report

    -max_alloc bytes    set maximum size of a single allocated block

    -sources device     list sources of the input device  显示输入设备的自动检测源。

    -sinks device       list sinks of the output device   显示输出设备的自动检测接收器。

    -x width            force displayed width

    -y height           force displayed height

    -s size             set frame size (WxH or abbreviation)

    -fs                 force full screen      强制全屏(和ffmpeg中的fs是不一样的用法)

    -an                 disable audio

    -vn                 disable video

    -sn                 disable subtitling

    -ss pos             seek to a given position in seconds     以秒为单位寻找给定位置

    -t duration         play  "duration" seconds of audio/video    播放音频/视频的“ duration”秒

    -bytes val          seek by bytes 0=off 1=on -1=auto      按字节查找  0=OFF   1=ON     -1=AUTO

    -nodisp             disable graphical display    禁用图形显示

    -noborder           borderless window     无边界窗口

    -volume volume      set startup volume 0=min 100=max   设置启动 volume0=min 100=max

    -f fmt              force format

    -window_title window title  set window title  窗口标题集窗口标题

    -af filter_graph    set audio filters   设置音频过滤器

    -showmode mode      select show mode (0 = video, 1 = waves, 2 = RDFT)  选择显示模式(0=视频,1=波形,2=RDFT)

    -i input_file       read specified file  读取指定文件

    -codec decoder_name  force decoder

    -autorotate         automatically rotate video  自动旋转视频

     

    下面是几个高级选项:

    Advanced options:

    -cpuflags flags     force specific cpu flags   强制特定CPU标志

    -hide_banner hide_banner  do not show program banner  不要显示程序横幅

    -ast stream_specifier  select desired audio stream   选择所需的音频流

    -vst stream_specifier  select desired video stream   选择所需视频流

    -sst stream_specifier  select desired subtitle stream   选择想要的字幕流

    -pix_fmt format     set pixel format   设置像素格式

    -stats              show status  显示当前状态

    -fast               non spec compliant optimizations   不符合规范的优化

    -genpts             generate pts   生成PTS

    -drp                let decoder reorder pts 0=off 1=on -1=auto   让解码器重新排序0=OFF 1=ON   -1=AUTO

    -lowres

    -sync type          set audio-video sync. type (type=audio/video/ext)  设置音视频同步类型(type=音频/视频/ext)

    -autoexit           exit at the end   最后退出

    -exitonkeydown      exit on key down  按下键退出

    -exitonmousedown    exit on mouse down   鼠标向下退出

    -loop loop count    set number of times the playback shall be looped      设置回放的次数

    -framedrop          drop frames when cpu is too slow         CPU太慢时丢弃帧

    -infbuf             don't limit the input buffer size (useful with realtime streams)   不要限制输入缓冲区的大小(对实时流有用)

    -vf filter_graph    set video filters   设置视频滤波器

    -rdftspeed msecs    rdft speed   rdft速度

    -default            generic catch all option  捕获通用所有选项

    -acodec decoder_name  force audio decoder

    -scodec decoder_name  force subtitle decoder

    -vcodec decoder_name  force video decoder

     

    接下来就是快捷键了(其实就是在已经在播放的时候  有什么功能)

    While playing:

    q, ESC              quit      退出

    f                   toggle full screen     全屏

    p, SPC              pause    暂停

    m                   toggle mute   切换静音

    9, 0                decrease and increase volume respectively            减少量和增加量

    /, *                decrease and increase volume respectively            减少量和增加量

    a                   cycle audio channel in the current program           循环当前程序中的音频通道

    v                   cycle video channel         循环视频信道

    t                   cycle subtitle channel in the current program       循环当前程序中的字幕通道

    c                   cycle program  循环程序

    w                   cycle video filters or show modes       循环视频过滤器或显示模式

    s                   activate frame-step mode      激活帧步模式(逐帧显示)

    left/right          seek backward/forward 10 seconds    先后/向前10S

    down/up             seek backward/forward 1 minute     先后/向前1minute

    page down/page up   seek backward/forward 10 minutes     先后/向前10minute

    right mouse click   seek to percentage in file corresponding to fraction of width   在文件中寻求与宽度分数相对应的百分比

    left double-click(双击)   toggle full screen    切换全屏

     

     

    **************************************************************************************************************************************

     

    ffprobe

    http://ffmpeg.org/ffprobe.html  官方说明

    ffprobe -h   显示的太多  我这边就不全贴上来了  就把主选项写一下

    开始  和之前的ffmpeg显示的是一样的

     

    我们来看下用法: ffprobe [OPTIONS] [INPUT_FILE]

    下面的就是主选项:

    Main options:

    -L                  show license

    -h topic            show help

    -? topic            show help

    -help topic         show help

    --help topic        show help

    -version            show version

    -buildconf          show build configuration

    -formats            show available formats

    -muxers             show available muxers

    -demuxers           show available demuxers

    -devices            show available devices

    -codecs             show available codecs

    -decoders           show available decoders

    -encoders           show available encoders

    -bsfs               show available bit stream filters

    -protocols          show available protocols

    -filters            show available filters

    -pix_fmts           show available pixel formats

    -layouts            show standard channel layouts

    -sample_fmts        show available audio sample formats

    -colors             show available color names

    -loglevel loglevel  set logging level

    -v loglevel         set logging level

    -report             generate a report

    -max_alloc bytes    set maximum size of a single allocated block

    -cpuflags flags     force specific cpu flags                                                        强制特定CPU标志

    -hide_banner hide_banner  do not show program banner                             不要显示程序横幅

    -sources device     list sources of the input device

    -sinks device       list sinks of the output device

    -f format           force format

    -unit               show unit of the displayed values                                              显示所显示值的单位

    -prefix             use SI prefixes for the displayed values                                     对显示的值使用si前缀

    -byte_binary_prefix  use binary prefixes for byte units                                    字节单位使用二进制前缀

    -sexagesimal        use sexagesimal format HOURS:MM:SS.MICROSECONDS for time units    使用六十进制格式小时:毫米:单位时间的微秒

    -pretty             prettify the format of displayed values, make it more human readable      美化显示值的格式,使其更具可读性。

    -print_format format  set the output printing format (available formats are: default, compact, csv, flat, ini, json, xml)    设置输出打印格式(可用格式有:默认格式、紧凑格式、csv格式、平面格式、ini格式、json格式、xml格式)

    -of format          alias for -print_format      别名-打印格式

    -select_streams stream_specifier  select the specified streams   选择指定的流

    -sections           print sections structure and section information, and exit   打印区段结构和区段信息,并退出

    -show_data          show packets data  显示数据包数据

    -show_data_hash     show packets data hash   显示数据包数据散列

    -show_error         show probing error  显示探测误差

    -show_format        show format/container info  显示格式/容器信息

    -show_frames        show frames info  显示帧信息

    -show_format_entry entry  show a particular entry from the format/container info    显示格式/容器信息中的特定条目

    -show_entries entry_list  show a set of specified entries   显示一组指定的条目

    -show_log           show log

    -show_packets       show packets info   显示数据包信息

    -show_programs      show programs info   显示程序信息

    -show_streams       show streams info   显示流信息

    -show_chapters      show chapters info   展示章节信息

    -count_frames       count the number of frames per stream     计算每个流的帧数。

    -count_packets      count the number of packets per stream     计算每个流的数据包数。

    -show_program_version  show ffprobe version   显示 ffprobe版本

    -show_library_versions  show library versions     显示库版本

    -show_versions      show program and library versions    显示程序和库版本

    -show_pixel_formats  show pixel format descriptions      显示像素格式描述

    -show_private_data  show private data           显示私有数据

    -private            same as show_private_data   类似 show_private_data

    -bitexact           force bitexact output    强制位数输出

    -read_intervals read_intervals  set read intervals   设定读间隔

    -default            generic catch all option       通用捕获所有选项

    -i input_file       read specified file       读取指定文件

     

     

     

    展开全文
  • 目录 0 前言 1 语法 Synopsis 2 描述 Description 3 详细描述 Detailed description 3.1 滤镜 Filtering ...3.1.1 简单滤镜图 Simple filtergraphs ...3.1.2 复杂滤镜图 Complex filtergraphs ...4 流选取Stream ...

    目录

    0 前言

    1 语法 Synopsis

    2 描述 Description

    3 详细描述 Detailed description

    3.1 滤镜 Filtering

    3.1.1 简单滤镜图 Simple filtergraphs

    3.1.2 复杂滤镜图 Complex filtergraphs

    3.2 流拷贝 Stream copy

    4 流选取 Stream selection

    4.1 描述 Description

    4.1.1 自动流选取 Automatic stream selection

    4.1.2 手动流选取 Manual stream selection

    4.1.3 复杂滤镜图 Complex filtergraphs

    4.1.4 流处理 Stream handing

    4.2 示例

    示例:自动流选取

    示例:自动字幕选取

    示例:未标记的滤镜图输出

    示例:带标记的滤镜图输出

    5 命令选项

    5.1 流指定器 Stream specifiers

    5.2 通用选项 Generic options

    5.3 主要选项 Main options

    5.4  AVOptions

    6 示例

    6.1 转封装

    6.2 转编码

    6.3 流媒体

    6.4 设备采集

    6.5 各种滤镜


    0 前言


    本文主要参考 ffmpeg documentation,以及《FFMPEG入门到精通》一书。

    本文中的示例将尽量详尽,涉及转封装,转码,流媒体,设备采集,滤镜使用等许多方面,每个示例也将经过实测。

    ffmpeg版本4.1  2019年3月1日记之。

    1 语法 Synopsis


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

    注意一点:可以有多个输入,多个输出

    2 描述 Description


    ffmpeg是一个非常快速的音频,视频转换器,不仅可以转换本地音视频,并且可以直接转换在线的音频视频源。还可以通过高质量的滤镜转换不同采样率的音频,不同分辨率的视频。

    ffmpeg可以读取多个输入文件(可以是常规的磁盘文件,管道,网络流,采集设备),可以由选项-i来指定输入文件,并将结果写入多个输出文件,输出文件由输出url指定。任何命令行中的参数如果无法被解释为选项option将被当做输出文件url。

    每个输入输出url原则上可以包含任意个数不同类型的流(视频,音频,字幕,数据,附属)。被允许的流个数和类型最终取决于封装容器格式。选择哪个输入流映射到哪个输出流要么是被ffmpeg自动处理,要么可以通过-map选项来指定

    要命令行中选项中引用输入文件,可以使用它们的下标指数(从0开始,依次类推),比如第一个文件是0,第二个文件是1,等等。类似的,文件中的流的引用也可以使用下标指数。比如2:3引用了第3个输入文件中的第4个流。进一步可以查看 “流选择”章节内容。

    作为一般化的规则,选项都作用于下一个特定的文件。顺序是非常重要的,因为同一个选项可以在一个命令行中出现多次。每次选项出现是作用于下一个输入文件或者是输出文件。特例是全局选项,这个应该在最开始指定。

    不要混淆输入和输出文件 —— 一开始指定所有的输入文件,然后才是所有的输出文件。不要混淆作用于不同文件的选项。所有选项仅仅作用于下一个输入或者输出文件,然后就被重置了。

          示例:

    •    设置视频的比特率为64kbit/s           ffmpeg -i 1.mp4 -b:v 64k output.mp4
    •    强制视频的帧率为24fps           ffmpeg -i 1.mp4 -r 24 output.mp4
    •    强制输入文件帧率为1fps,输出文件的帧率为24fps      ffmpeg -r 1 -i 1.mp4 -r 24 output.mp4 

    3 详细描述 Detailed description


    ffmpeg中的对于每个输出文件的转码过程可以使用下图表示:

    ffmpeg调用libavformat库(该库包含解封装器demuxers)去读取输入文件,获取文件中编码过的数据包。当存在多个输入文件时,ffmpeg将根据所有输入流中的最低时间戳来保持同步。

    编码过的数据包将进一步被传递给解码器(除非采用流复制的方式,即不改变流的编码方式)。编码器将编码过的数据包packets解码后产生数据帧frames(包括原始的视频采样数据,音频pcm采样数据...),这些数据帧还可以进一步的被滤镜处理。滤镜处理后的数据帧将被传递给编码器,编码器对数据帧进行编码,形成新的编码后的数据包packets。最终编码后的数据包传递给封装器muxer,按照文件格式要求写入到输出文件中。

    3.1 滤镜 Filtering


    在原始音频帧数据被编码前,ffmpeg可以使用libavfilter中的滤镜对其进行处理。滤镜图(filtergraphs)由几个滤镜链(chained filters)组成,ffmpeg中区分两种类型的滤镜图:简单和复杂的

    3.1.1 简单滤镜图 Simple filtergraphs


    简单的滤镜图是指处理只有一个输入文件和一个输出文件,并且二者有同样类型。在上图中,简单滤镜图表演的角色就是在解码和编码之间插入一个额外的步骤:

    简单滤镜图配置为一个流一个filter选项(-vf视频滤镜,-af音频滤镜,-sf字幕滤镜)。一个视频的简单滤镜图像如下图展示的这样:

    注意一些滤镜会改变帧属性但是不会改变帧内容。比如fps滤镜将改变帧的数量,但是不会去修改一帧数据中存储的内容;又比如setpts滤镜,仅仅会修改帧的时间戳,然后就完成了这帧数据的处理而没有改变帧内数据。

    3.1.2 复杂滤镜图 Complex filtergraphs


    复杂滤镜图用于对一个流的处理不能使用简单线性处理链(即挨个使用滤镜就能完成的功能)。比如,当过滤图含有多个输入或者输出是,或者输出流的类型与输入不一致。复杂滤镜图可以用下图表示:

    注意这个选项是全局的,因为复杂滤镜图天然就是不会二义性的关联到单个流或者是文件。

    选项-lavfi和-filter_complex是等价的。

    用来展示复杂滤镜图的常用例子就是overlay滤镜,这个滤镜有两个视频输入和一个视频输出,这个视频输出就其中一个输入放置再另一个输出上面得来的。音频滤镜中相似的就是amix滤镜。

    3.2 流拷贝 Stream copy


    流拷贝是一种模式选择,可以通过选项-codec加参数copy实现。允许ffmpeg对特定的流跳过解码和编码的环节,只进行解封装和再封装。这种操作对于改变容器格式或者是改变容器级别的metadata非常有用。上面的流程图,在这种情况下,就可以简化为下图:

    既然不存在解码和编码,那么流拷贝将非常快,并且没有质量损失。然而,在某些情况下因为一些因素无法正常工作。总之,使用滤镜是非常重要的,因为滤镜工作于非压缩数据这个层级。

    4 流选取 Stream selection


    ffmpeg提供了-map选项来实现手动控制每个输入文件的流选取。用户也可以跳过-map选项让ffmpeg自动进行流选取。-vn/-an/-sn/-dn选项可以用来跳过包含的视频,音频,字母,数据流,不管是手动映射还是自动选取,除非这些流是作为复杂滤镜输出项。

    4.1 描述 Description

    下面的子章节将描述流选取中各种不同的规则。下面的例子将展示在实际中利用这些规则。每种效果精确的反应了软件的行为,而ffmpeg还处于持续的开发中,因此,代码会随着时间变化,以下描述也可能会有不同。

    4.1.1 自动流选取 Automatic stream selection


    在没有使用任何map选项时,ffmpeg会根据输出容器格式去检查流的类型看是否能被封装进来,视频,音频,字幕的格式将都被考虑到。对于所有能接受的流类型,ffmpeg将会从所有输入文件中选择其中一个可以获取的流。

    选取流的规则基于以下标准:

    • 对于视频,将选择分辨率最高的流,
    • 对于音频,将选择通道数最多的流,
    • 对于字幕,将选择第一个被找到的字幕流,但是还有一个附加的说明。输出文件格式默认字幕编码器可以是基于文本的或者是基于图像的,只有字幕流是相同类型的才会被选取。
    • 当几个流类型相同,基本上无差别,那么将选取index最低的那个。
    • 数据和附加流不能被自动选择,只能使用-map来手动选择。

    4.1.2 手动流选取 Manual stream selection


    当使用-map选项时,只有映射中的流会被包含进输出文件,只有一种例外,下面将描述。

    4.1.3 复杂滤镜图 Complex filtergraphs


    如果复杂滤镜图的输出流没有标明归属,他们将被加入到第一个输出文件中。这种情况,如果输出文件格式不支持这种流格式的话将会导致致命错误。如果没有使用-map选项,这些流将被自动选择,根据他们的流类型是否合适进行跳过。如果使用了-map选项,这些滤镜图流将会跟映射的流一起被包含进去。

    复杂滤镜图中带标签的输出流必须被映射一次且只能被映射一次。

    4.1.4 流处理 Stream handing


    流的处理和流的选取是独立的,除了字幕。通过-codec选项对指定流进行处理并存储到指定输出文件。特别的,当-codec选项紧跟着流选取,将不会影响到后续的命令行部分。如果对于某个类型的流没有使用-codec选项,ffmpeg将选择输出文件封装器注册的默认编码器。

    字幕的处理将会是个例外。如果字幕的编码器被指定,那么第一个字幕流,不管是基于文本还是基于图像的,将被包含进来。ffmpeg不会去验证指定编码器是否能转换选择的流或者转换后的流是否被输出文件封装格式所接受。对于这种应用场景也是一样:当用户手动设置编码器,选取的流处理也不会去验证编码后的流是否能被封装进输出文件。如果不能,ffmpeg将终止运行,所有输出文件的处理将以失败告终。

    4.2 示例


    下面所示例子展示了一般性行为,特殊情况,以及ffmpeg流选取的一些限制。

    示例中三个输入文件情况如下:

    示例:自动流选取


    命令行中有三个输出文件,对于前两个输出文件,没有使用-map,因此ffmpeg将会为这两个输出文件自动选取流。

    out1.mkv 是一个Matroska容器文件,接受视频,音频,字幕流,因此ffmpeg将会每个类型的流都试图选择一个。

    对于视频,将会选择B.mp4文件的stream 0,因为在两个文件的所有视频流中它的分辨率是最高的。

    对于音频,将会选择B.mp4文件的stream 3,因为在两个文件的所有音频流中它的通道数是最多的。

    对于字幕,将会选择B.mp4文件的stream 2,因为它是两个文件中第一个字幕流。

    out2.wav仅接受音频流,因此B.mp4文件的stream 3将被选取。

    对于out3.mov,因为使用了-map选项,因此ffmpeg将不会自动选取流。-map 1:a指明选取第二个文件的所有音频流,其他流将不会被包含进输出文件。

    对于前两个输出,所有包含的流将会被转码。编码器的选择使用输出文件格式所注册默认编码器,可能和选取的输入流的编解码器不一样。

    对于第三个输出,编解码器选项-c:a已经被指定为copy,因此不会有解码-滤镜-编码操作过程。选取流中编码数据包将从输入文件直接封装进输出文件。

    示例:自动字幕选取


    尽管out1.mkv是Matroska容器文件,可以容纳字幕流,但是上述操作只有视频流和视频流会被选择并存入out1.mkv文件。C.mkv中的字幕流是image-based,而Matroska容器文件中默认的字幕流编码器是text-based,转码操作将会不成功,因此C.mkv中的字幕流将不会被选取。对于out2.mkv,由于字幕编码器通过-c:s dvdsub选定,因此输入文件中的字幕流将被选取,视频流也会被选取,但是音频流由于存在-an选项,因此不会被选取。

    示例:未标记的滤镜图输出


    这个命令行中使用了-filter_complex选项,由单个视频滤镜组成。“overlay”滤镜需要2个视频输出流,但是上述命令行中没有被指定,因此前两个可以使用的视频流将被使用,即A.avi的stream 0和C.mkv的stream 0。由于“overlay”滤镜的输出部分没有label标识,因此滤镜的输出将输送到第一个输出文件out1.mp4中。视频流的自动选择因上述原因将被跳过,否则自动选择会选择到B.mp4中的视频流(因其分辨率在所有流中是最大的)。音频流将被自动选择,由于B.mp4文件中的stream 3有最多的通道数而被选择。因为mp4文件格式没有注册默认的字幕编码器,而此命令行中又没有指定一个字幕编码器,因此字幕流将不会被选择。

    对于第二个输出文件,out2.srt,只接受text-based字幕。因此即便第一个可获取的字幕流是C.mkv中的stream 2,但由于是image-based 因而被跳过。而B.mp4文件中的字幕流stream 2是第一个text-based字幕流而被选择。

    示例:带标记的滤镜图输出


    上述命令将执行失败,因为[outv]这个标识的流被映射了两次。将不会产生任何输出文件

    上述命令也将执行失败,原因在于滤镜“hue”有输出标识[outv],但是没有被映射到任何文件中去。

    上述命令将被修改成如下所示,

    B.mp4的视频流将由滤镜“hue”处理,其输出被“split”滤镜克隆为[outv1]和[outv2]两个标签。然后各自被映射到out1.mp4和out3.mkv中去。

    “overlay”滤镜需要有两个输入视频流——使用前两个没有被使用过的。由于B.mp4中的视频流已经被“hue”和“spilt”滤镜处理,因此“overlay”滤镜将处理A.avi stream 0和C.mkv stream 0。因为“overlay”滤镜的输出没有使用标签,因此将其输出将被输送到第一个输出文件out1.mp4,忽略掉了-map选项的存在。

    “aresample”滤镜使用了第一个没有被处理的音频流,即A.avi的stream 0。由于此滤镜也没有输出标签,因此其输出也将被输送到第一个输出文件out1.mp4中。-an选项只能处理自动或者手动选择音频流,不能处理由滤镜图的输出。所有这些被映射的流将在映射到out1.mp4前被排序。

    输出文件out2.mkv中的视频,音频,字幕流全部都取决于自动流选取机制。即B.mp4 stream 0, B.MP4 stream 3,B.MP4 stream 2

    输出文件out3.mkv包含了经过“hue”滤镜处理过的视频流[outv2]和B.mp4第一个音频流 stream 1

    5 命令选项


    所有数字选项,如果没有特别指明的话,接受一个字符串来替代数字作为输入,一般是数字后跟随一个SI单位,比如‘K’,‘M’,‘G’。

    如果‘i’跟随在SI单位之后出现,那么数字大小将被解释为以1024为基础的而非1000。如果'B'跟随在SI单位后出现,那么值将乘以8。将会出现‘KB’, ‘MiB’, ‘G’ 和 ‘B’作为数字的后缀。

    没有参数的选项是bool选项,将设置相关的参数为true。相关参数可以被设置为false,通过在相应的选项前加个‘no’。比如,使用‘-nofoo’选项,将会使得‘-foo’选项设置的参数为false。

    5.1 流指定器 Stream specifiers


    一些选项可以应用于每个流。流指定器用来精确指定选项作用于哪个流。

    流指定器一般是跟随选项的字符串,用‘:’来隔开。比如 “-codec:a:1 ac3”包含了流指定器 a:1,匹配第二个音频流。因此作用是对第二个音频流使用ac3的编解码器。

    一个流指定器可以匹配多个流,因此选项可以应用到这些多个流中。比如,“-b:a 128k”中的流指定器匹配所有的音频流。

    一个空的流指定器匹配所有流。比如,-codec copy 或者 -codec: copy将会匹配所有的流。

    流指定器可能的格式:

    • stream_index   匹配流序号。比如,-threads:1 4 将设置处理第二个流的线程数为4。如果stream_index用于指定器的追加参数,那么将会选择匹配的相应序号的流
    • stream_type[:additional_stream_specifier]    stream_type是指:音频流类型使用'a',字幕流类型使用's',数据流类型使用'd',附加类型使用't',视频流类型使用'v'或者'V',小'v'匹配所有的视频流,大'V'仅匹配非附加图片,视频缩略图,艺术封面图。当additional_stream_specifier被使用的,那么将匹配type:index一致的单个流,如果不使用additional_stream_specifier,那么将匹配所有和type一致的流。
    • p:program_id[:additional_stream_specifier]    匹配节目id相应的流。
    • #stream_id or i:stream_id    匹配流通过流id(比如MPEG-TS容器中的PID)
    • m:key[:value]     匹配流的metadata中相应tag(key)含有指定值的流。如果value没有给出,那么匹配所有含有指定tag的所有流
    • u     匹配具有可用配置的流,必须定义编解码器,并且必须提供诸如视频维度或音频采样率等基本信息。

    注意,在ffmpeg中匹配meatdata只会对输入文件工作正常。

    5.2 通用选项 Generic options


    通用选项部分参见ffmpeg documentation 以及  [总结]FFMPEG命令行工具之ffprobe详解

    5.3 主要选项 Main options


    5.3.1 -f fmt (input/output)

    Force input or output file format. The format is normally auto detected for input files and guessed from the file extension for output files, so this option is not needed in most cases.

    5.3.2 -i url (input)

    input file url

    5.3.3 -y (global)

    Overwrite output files without asking.

    5.3.4 -n (global)

    Do not overwrite output files, and exit immediately if a specified output file already exists.

    5.3.5 -stream_loop number (input)

    Set number of times input stream shall be looped. Loop 0 means no loop, loop -1 means infinite loop.

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

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

    Select an encoder (when used before an output file) or a decoder (when used before an input file) for one or more streams. codec is the name of a decoder/encoder or a special value copy (output only) to indicate that the stream is not to be re-encoded.

    For example

    encodes all video streams with libx264 and copies all audio streams.

    For each stream, the last matching c option is applied, so

    will copy all the streams except the second video, which will be encoded with libx264, and the 138th audio, which will be encoded with libvorbis.

    5.3.7 -t duration (input/output)

    When used as an input option (before -i), limit the duration of data read from the input file.

    When used as an output option (before an output url), stop writing the output after its duration reaches duration.

    duration must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

    -to and -t are mutually exclusive and -t has priority.

    5.3.8 -to position (input/output)

    Stop writing the output or reading the input at position. position must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

    -to and -t are mutually exclusive and -t has priority.

    5.3.9 -fs limit_size (output)

    Set the file size limit, expressed in bytes. No further chunk of bytes is written after the limit is exceeded. The size of the output file is slightly more than the requested file size.

    5.3.10 -ss position (input/output)

    When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved.

    When used as an output option (before an output url), decodes but discards input until the timestamps reach position.

    position must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

    5.3.11 -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.

    5.3.12 -itsoffset offset (input)

    Set the input time offset.

    offset must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

    The offset is added to the timestamps of the input files. Specifying a positive offset means that the corresponding streams are delayed by the time duration specified in offset.

    5.3.13 -timestamp date (output)

    Set the recording timestamp in the container.

    date must be a date specification, see (ffmpeg-utils)the Date section in the ffmpeg-utils(1) manual.

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

    Set a metadata key/value pair.

    An optional metadata_specifier may be given to set metadata on streams, chapters or programs. See -map_metadata documentation for details.

    This option overrides metadata set with -map_metadata. It is also possible to delete metadata by using an empty value.

    For example, for setting the title in the output file:

    To set the language of the first audio stream:

    5.3.15 -disposition[:stream_specifier] value (output,per-stream)

    Sets the disposition for a stream.

    This option overrides the disposition copied from the input stream. It is also possible to delete the disposition by setting it to 0.

    The following dispositions are recognized:

    default, dub,original,comment,lyrics,karaoke,forced,hearing_impaired,visual_impaired,clean_effects

    attached_pic,captions,descriptions,dependent,metadata。

    For example, to make the second audio stream the default stream:

    To make the second subtitle stream the default stream and remove the default disposition from the first subtitle stream:

    To add an embedded cover/thumbnail:

    Not all muxers support embedded thumbnails, and those who do, only support a few formats, like JPEG or PNG.

    5.3.16 -program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)

    Creates a program with the specified title, program_num and adds the specified stream(s) to it.

    5.3.17-target type (output)

    Specify target file type (vcd, svcd, dvd, dv, dv50). type may be prefixed with pal-, ntsc- or film- to use the corresponding standard. All the format options (bitrate, codecs, buffer sizes) are then set automatically. You can just type:

    Nevertheless you can specify additional options as long as you know they do not conflict with the standard, as in:

    5.3.18 -dn (input/output)

    As an input option, blocks all data streams of a file from being filtered or being automatically selected or mapped for any output. See -discard option to disable streams individually.

    As an output option, disables data recording i.e. automatic selection or mapping of any data stream. For full manual control see the -map option.

    5.3.19 -dframes number (output)

    Set the number of data frames to output. This is an obsolete alias for -frames:d, which you should use instead.

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

    Stop writing to the stream after framecount frames.

    5.3.21 -q[:stream_specifier] q (output,per-stream)

               -qscale[:stream_specifier] q (output,per-stream)

    Use fixed quality scale (VBR). The meaning of q/qscale is codec-dependent. If qscale is used without a stream_specifier then it applies only to the video stream, this is to maintain compatibility with previous behavior and as specifying the same codec specific value to 2 different codecs that is audio and video generally is not what is intended when no stream_specifier is used.

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

    Create the filtergraph specified by filtergraph and use it to filter the stream.

    filtergraph is a description of the filtergraph to apply to the stream, and must have a single input and a single output of the same type of the stream. In the filtergraph, the input is associated to the label in, and the output to the label out. See the ffmpeg-filters manual for more information about the filtergraph syntax.

    See the -filter_complex option if you want to create filtergraphs with multiple inputs and/or outputs.

    5.3.23 -filter_script[:stream_specifier] filename (output,per-stream)

    This option is similar to -filter, the only difference is that its argument is the name of the file from which a filtergraph description is to be read.

    5.3.24 -filter_threads nb_threads (global)

    Defines how many threads are used to process a filter pipeline. Each pipeline will produce a thread pool with this many threads available for parallel processing. The default is the number of available CPUs.

    5.3.25 -pre[:stream_specifier] preset_name (output,per-stream)

    Specify the preset for matching stream(s).

    5.3.26 -stats (global)

    Print encoding progress/statistics. It is on by default, to explicitly disable it you need to specify -nostats.

    5.3.27 -progress url (global)

    Send program-friendly progress information to url.

    Progress information is written approximately every second and at the end of the encoding process. It is made of "key=value" lines. key consists of only alphanumeric characters. The last key of a sequence of progress information is always "progress".

    5.3.28 -stdin

    Enable interaction on standard input. On by default unless standard input is used as an input. To explicitly disable interaction you need to specify -nostdin.

    Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process group. Roughly the same result can be achieved with ffmpeg ... < /dev/null but it requires a shell.

    5.3.29 -debug_ts (global)

    Print timestamp information. It is off by default. This option is mostly useful for testing and debugging purposes, and the output format may change from one version to another, so it should not be employed by portable scripts.

    See also the option -fdebug ts.

    5.3.30 -attach filename (output)

    Add an attachment to the output file. This is supported by a few formats like Matroska for e.g. fonts used in rendering subtitles. Attachments are implemented as a specific type of stream, so this option will add a new stream to the file. It is then possible to use per-stream options on this stream in the usual way. Attachment streams created with this option will be created after all the other streams (i.e. those created with -map or automatic mappings).

    Note that for Matroska you also have to set the mimetype metadata tag:

    (assuming that the attachment stream will be third in the output file).

    5.3.31 -dump_attachment[:stream_specifier] filename (input,per-stream)

    Extract the matching attachment stream into a file named filename. If filename is empty, then the value of the filename metadata tag will be used.

    E.g. to extract the first attachment to a file named ’out.ttf’:

    To extract all attachments to files determined by the filename tag:

    Technical note – attachments are implemented as codec extradata, so this option can actually be used to extract extradata from any stream, not just attachments.

    5.3.32 -noautorotate

    Disable automatically rotating video based on file metadata.

    5.4  AVOptions

    这些选项是libavformat,libavdevice,libavcodec库直接提供的。使用-help option查看可用的AVOption选项。分为两个部分:

    通用选项 generic

           通用选项可以作用于所有容器,编解码器,设备。通用选项列举在AVFormatContext(作用于容器和设备) 选项下方以及AVCodecContext (作用于编解码器)选项下方。

    私有选项 private

           私有选项作用于特定的容器,编解码器,设备。列举在对应的容器,编解码器,设备下方。

    例如,使用ID3V2.3头取代mp3文件默认的ID3V2.4,使MP3封装器私有的id3v2_version 选项:

     所有编解码器AVOptions作用于每个流,因此一个使用流指定器来指定流很有必要:

    在上面这个示例中,一个多通道的音频流被映射了2次。第一个实例使用ac3编码为比特率为640k的流。第二个实例被降到2个通道并使用aac编码,并且通过输出流下标方式的流指定器指定并设置比特率为128k。

    注意:-nooption语法不能作为布尔类型的AVOptions,而是使用-option 0/-option 1。

    注意:旧文档中描述的使用在选项名字前加v/a/s方式指定AVOption选项的方式将被弃用。

    6 示例


    目前示例这块儿将会在后续慢慢完善

    6.1 转封装


    预计在看完mp4 mov flv mpeg-ts m3u8后将会在此长篇叙述。目前且空留此处~~~~fighting,切不可懈怠~~~~~~2019.3.1记之。

    6.2 转编码


    6.3 流媒体


    6.4 设备采集


    6.5 各种滤镜


     

    展开全文
  • (Ctrl+F开启搜索)。 扩展阅读:... a) 通用选项 -L license -h 帮助 ...-fromats 显示可用的格式,编解码的,协议的.. -f fmt 强迫采用格式fmt -I filename 输入文件 -y 覆盖输出文件 -t duration ...
  • Date: 2018.9.20【Tag: 视频编解码】 1、引言 FFMPEG以其强大的功能而在音视频领域著称,更重要的是它还是开源的!音视频格式转换、裁剪、拼接、提取字幕或某音轨等等,它都能胜任,可谓一把瑞士军刀,小巧但功能...
  • ffmpeg命令行参数优化

    2019-07-08 09:12:27
    我测试了下ffmpeg直播流的转码延时,这些参数对文件的转码也是通用的;测试环境: . ffmpeg 版本为v3.0.2 . 从同一台服务器...
  • FFmpeg命令行

    2018-12-24 15:21:34
    FFmpeg命令行 记录一下常用的命令行 介绍 基础语法与流程 ffmpeg [gl-opt] {[input-file-opt] -i input-url} ... {[output-file-opt] output-url} ... 其中, -i 表示输入参数. 主要参数 下表中: 以 &lt;&...
  • FFMPEG 命令行参数详解

    2020-02-13 09:58:41
    FFMPEG 3.4.1 版本 1、基础用法 ‘’'Python ffmpeg [options] [[infile options] -i infile] … {[outfile options] outfile}...-fromats 显示可用的格式,编解码的,协议的… -f fmt 强迫采用格式fmt -I filename ...
  • FFMPEG以其强大的功能而在音视频领域著称,更重要的是它还是开源的!音视频格式转换、裁剪、拼接、提取字幕或某音轨等等,它都能胜任,可谓一把瑞士军刀,小巧但功能强大,是音视频研究的必备利器之一。 2、常用...
  • 此处仅列举 yuv420 到 rgb24 格式之间的转换,其他格式转换方式与此类似 ffmpeg -s 360x270 -pix_fmt yuv420p -i 2_test_360x270_50.yuv -pix_fmt rgb24 aaaa.rgb
  • 引言 FFMPEG以其强大的功能而在音视频领域著称,更重要的是它还是开源的!音视频格式转换、裁剪、拼接、提取...1. 转换成H264编解码 ffmpeg -i input_file -vcodec h264 output_file 其中 -i 表示输入文件, -vcodec h2
  • FFmpeg枚举编解码

    2019-04-12 11:23:43
    通过获取FFmpeg中的编码器名字,codec->name),然后可以直接通过avcodec_find_encoder_by_name获取编码器; codec = avcodec_find_encoder_by_...id (AVCodecID),通过avcodec_find_encoder获取编解码器; code...
  • 那么在这篇文章中,我们将介绍如何将我们编译好的ffmpeg库接入到我们的Android项目中,并介绍移植ffmpeg强大的命令行工具到Android App里。另外我们会介绍如何使用OpenGL ES来渲染我们相机的实时预览画面。闲话少说...
  • 这个blog有一系列的ffmpeg的源码分析,建议系统读...精准裁剪音视频的原理是:没有精准裁剪的都只是进行的数据的转封装,会受到关键帧的影响,所以如果需要特别准确的剪切,只能使用ffmpeg进行重新编解码的操作。 ...
  • ffmpeg命令行工具测试

    2018-07-26 16:39:32
    之前的文章把ffmpeg命令行大致的options都列了一遍 现在就来测试一遍 在测试之前 我们需要知道利用ffmpeg转码的时候 具体的流程是什么样的 关于过滤器的使用 简单过滤其实可以看做是在解码和编码之间插入...
  • ffmpeg命令行

    2020-06-20 12:14:51
    windows环境下,下载static版本解压即可使用ffmpeg,但是ffplay播放audio的时候需要设置环境变量 SDL_AUDIODRIVER=directsound FFmpeg command-line tools ffmpeg fast audio and video ...
  • FFmpeg 命令行基本用法

    2016-09-18 23:33:22
    FFmpeg FFmpeg 基本用法 本课要解决的问题 1.FFmpeg的转码流程是什么? 2.常见的视频格式包含哪些内容吗? 3.如何把这些内容从视频文件中抽取出来? 4.如何从一种格式转换为另一种格式? 5.如何放大和缩小
  • 将h264文件放到主目录下 ~$ ffmpeg -i text.h264 -vcodec rawvideo -an out.yuv
1 2 3 4 5 ... 20
收藏数 5,286
精华内容 2,114