• FFmpeg命令行工具学习(三):媒体文件转换工具ffmpeg


    一、简述

    ffmpeg是一个非常强大的工具,它可以转换任何格式的媒体文件,并且还可以用自己的AudioFilter以及VideoFilter进行处理和编辑。有了它,我们就可以对媒体文件做很多我们想做的事情了。

    二、命令行参数

    1. 通用参数

    • -f fmt : 指定格式
    • -i filename:指定输入文件名
    • -y:覆盖已有文件
    • -t duration:指定时长
    • -fs limit_size:设置文件大小的上限
    • -ss time_off: 从指定的时间开始
    • -re:代表按照时间戳读取或发送数据,尤其在作为推流工具的时候一定要加上该参数,否则ffpmeg会按照最高速率向流媒体不停的发送数据。
    • -map:指定输出文件的流映射关系。例如:“-map 1:0 -map 1:1”要求按照第二个输入的文件的第一个流和第二个流写入输出文件。如果没有设置此项,则ffpmeg采用默认的映射关系。

    2. 视频参数

    • -b:指定比特率(bit/s),ffmpeg默认采用的是VBR的,若指定的该参数,则使用平均比特率。
    • -bitexact:使用标准比特率。
    • -vb:指定视频比特率(bit/s)
    • -r rate:帧速率(fps)
    • -s size:指定分辨率(320x240)
    • -aspect aspect:设置视频长宽比(4:3、16:9或1.33333、1.77777)
    • -croptop size:设置顶部切除尺寸(in pixels)
    • -cropleft size:设置左切除尺寸(in pixels)
    • -cropbottom size:设置地步切除尺寸(in pixels)
    • -cropright size:设置右切除尺寸(in pixels)
    • -padtop size:设置顶部补齐尺寸(in pixels)
    • -padleft size:设置左补齐尺寸(in pixels)
    • -padbottom size:设置地步补齐尺寸(in pixels)
    • -padright size:设置右补齐尺寸(in pixels)
    • -padcolor color:设置补齐颜色
    • -vn:取消视频的输出
    • -vcodec codec:强制使用codec编码方式

    3. 音频参数

    • -ab:设置比特率(bit/s),对于MP3的格式,想要听到较高品质的声音,建议设置160Kbit/s(单声道80Kbit/s)以上。
    • -aq quality:设置音频质量
    • -ar ratre:设置音频采样率(Hz)
    • -ac channels:设置声道数,1就是单声道,2就是立体声
    • -an:取消音频输出
    • -acodec codec:强制使用codec编码方式
    • -vol volume:设置录制音量大小

    以上就是在日常开发中经常用到的音视频参数及通用参数。下面会针对常见的开发场景进行实践和说明。

    三、实践学习

    1. 列出ffmpeg支持的所有格式

    相关命令:

    ffmpeg -formats

    输出结果:

    File formats:
     D. = Demuxing supported
     .E = Muxing supported
     --
     D  3dostr          3DO STR
      E 3g2             3GP2 (3GPP2 file format)
      E 3gp             3GP (3GPP file format)
     D  4xm             4X Technologies
      E a64             a64 - video for Commodore 64
     D  aa              Audible AA format files
     D  aac             raw ADTS AAC (Advanced Audio Coding)
     DE ac3             raw AC-3 
    省略...... D xbin eXtended BINary text (XBIN) D xmv Microsoft XMV D xpm_pipe piped xpm sequence D xvag Sony PS3 XVAG D xwma Microsoft xWMA D yop Psygnosis YOP DE yuv4mpegpipe YUV4MPEG pipe

    2. 剪切一段媒体文件,可以是音频或者视频文件

    相关命令:

    ffmpeg -i pm.mp4 -ss 00:00:50.0 -codec copy -t 20 output.mp4

    命令说明:

    表示将文件pm.mp4从第50s开始剪切20s的时间,输出到output.mp4中,其中-ss指定偏移时间(time Offset),-t指定的时长(duration)。

    但是直接这样执行命令,固然我们能截取出来音视频的文件,但是当我们播放的时候,我们会发现虽然ffmepg剪切视频,很方便,但是也有很大缺陷:

    (1). 剪切时间点不精确 
    (2). 有时剪切的视频开头有黑屏

    造成这些问题的原因是ffmpeg无法seek到非关键帧上。

    命令层面定位的话就是如果把-ss, -t参数放在-i参数之后,是对输出文件执行的seek操作 
    输入文件会逐帧解码,直到-ss设置的时间点为止,这么操作会很慢,虽然时间点是准确的,但是很容易出现黑屏问题。

    所以:我们优化了一下上面的那个命令,让视频的剪切更加精确:

    ffmpeg -ss 10 -t 15 -accurate_seek -i pm.mp4 -codec copy output.mp4 

    注意:accurate_seek必须放在-i参数之前。 

    但是,可能又会有人发现,还是存在剪切不准确的现象,那是因为,上述命令只是进行了数据的转封装,会受到关键帧的影响,所以如果需要特别准确的剪切,只能使用ffmpeg进行重新编解码的操作了,命令行如下:

    ffmpeg -i input.mp4 -ss 00:00:03.123 -t 10 -c:v libx264 -c:a aac out.mp4

    此命令行相对上面的转封装的剪切来说,速度明显变慢,是因为对视频数据重新编解码了,但是精度相对转封装来说是大大提高了。

    3. 提取视频文件中的音频数据,并保存为文件

    相关命令:

    ffmpeg -i pm.mp4 -vn -acodec copy output.m4a

    命令说明:

    将文件pm.mp4的视频流禁用掉(参数为:-vn,如果禁用音频流参数为-an,禁用字母流参数为-sn )。

    然后将pm.mp4中的音频流的数据封装到output.m4a文件中,音频流的编码格式不变。

    4. 将视频中的音频静音,只保留视频

    相关命令:

    ffmpeg -i pm.mp4 -an -vcodec copy output.mp4 

    命令说明:

    将文件pm.mp4的音频流禁用掉(参数为:-an )。

    然后将pm.mp4中的视频流的数据封装到output.mp4文件中,视频流的编码格式不变。

    5. 从mp4文件中抽取视频流导出为裸H264数据:

    相关命令:

    ffmpeg -i pm.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb output.h264

    命令说明:

    在指令中,我们舍弃了音频数据(-an),视频数据使用mp4toannexb这个bitstreasm filter来转换为原始的H264数据。(注:同一编码也会有不同的封装格式)。

    验证播放:

    可以使用ffplay命令进行尝试播放,如果能播放成功,则说明生效。

    6. 将视频推送到流媒体服务器上:

    ffmpeg -re -i pm.mp4 -acodec copy -vcodec copy -f flv rtmp://127.0.0.1/rh/mylive 

    命令说明: 

    将mp4文件的音视频数据的编码格式不变,按照rtmp的方式,将视频推送到流媒体服务器上。

    7. 将流媒体服务器上的流dump到本地:

    ffmpeg -i rtmp://127.0.0.1/rh/mylive -acodec copy -vcodec copy -f flv test.flv

    命令说明:

    将流媒体服务器的数据,不进行转码,通过转封装的方式保存到本地。

    8. 给视频添加水印

    ffmpeg -i pm.mp4 -i xxx.png -filter_complex "overlay=5:5"  out.mp4

    命令说明:

    使用ffmpeg滤镜功能,将对mp4添加水印。

    9. 倒放音视频

    // 1.视频倒放,无音频
    ffmpeg.exe -i inputfile.mp4 -filter_complex [0:v]reverse[v] -map [v] -preset superfast reversed.mp4
    // 2.视频倒放,音频不变
    ffmpeg.exe -i inputfile.mp4 -vf reverse reversed.mp4
    // 3.音频倒放,视频不变
    ffmpeg.exe -i inputfile.mp4 -map 0 -c:v copy -af "areverse" reversed_audio.mp4
    // 4.音视频同时倒放
    ffmpeg.exe -i inputfile.mp4 -vf reverse -af areverse -preset superfast reversed.mp4

    10.  将几个MP4视频文件合并为1个视频.

    实现思路:

    1.先将MP4文件转化为同样编码形式的ts流(ts流支持concate)

    2.第二步,连接(concate)ts流

    3.最后,把连接好的ts流转化为MP4.

    // 转换为ts流
    ffmpeg -i 0.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 0.ts ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts ffmpeg -i 3.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 3.ts ffmpeg -i 4.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 4.ts ffmpeg -i 5.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 5.ts // 合并ts流为mp4 ffmpeg -i "concat:0.ts|1.ts|2.ts|3.ts|4.ts|5.ts" -acodec copy -vcodec copy -absf aac_adtstoasc FileName.mp4
  • 相关阅读:
    POJ3345 Bribing FIPA(树形DP)
    POJ3294 Life Forms(二分+后缀数组)
    ZOJ1027 Travelling Fee(DP+SPFA)
    POJ2955 Brackets(区间DP)
    POJ1655 Balancing Act(树的重心)
    POJ2774 Long Long Message(后缀数组)
    URAL1297 Palindrome(后缀数组)
    SPOJ705 SUBST1
    POJ3261 Milk Patterns(二分+后缀数组)
    POJ1743 Musical Theme(二分+后缀数组)
  • 原文地址:https://www.cnblogs.com/renhui/p/9223969.html
Copyright © 2020-2023  润新知