搜索
 找回密码
 立即注册

ffmpeg转码视频

音视频开发进阶 2022-11-15 21:22:57 181

转码和编辑视频 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库

libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。 FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1] FFmpeg编码库可以使用GPU加速 多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

命令集

<pre class="public-DraftStyleDefault-pre" data-offset-key="e5pbd-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="e5pbd-0-0"><div data-offset-key="e5pbd-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="e5pbd-0-0"><span data-text="true">ffmpeg 命令集举例

1.获取视频的信息

ffmpeg -i video.avi

2.将图片序列合成视频

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

上面的命令会把当前目录下的图片(名字如:image1.jpg. image2.jpg. 等...)合并成video.mpg

3.将视频分解成图片序列

ffmpeg -i video.mpg image%d.jpg

上面的命令会生成image1.jpg. image2.jpg. ...

支持的图片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI

4.为视频重新编码以适合在iPod/iPhone上播放

ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4

说明:

  • 源视频:source_video.avi

  • 音频编码:aac

  • 音频位率:128kb/s

  • 视频编码:mpeg4

  • 视频位率:1200kb/s

  • 视频尺寸:320 X 180

  • 生成的视频:final_video.mp4

5.为视频重新编码以适合在PSP上播放

ffmpeg -i source_video.avi -b 300 -s 320x240 -vcodec xvid -ab 32 -ar 24000 -acodec aac final_video.mp4

说明:

  • 源视频:source_video.avi

  • 音频编码:aac

  • 音频位率:32kb/s

  • 视频编码:xvid

  • 视频位率:1200kb/s

  • 视频尺寸:320 X 240

  • 生成的视频:final_video.mp4

6.从视频抽出声音.并存为Mp3

ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3

说明:

  • 源视频:source_video.avi

  • 音频位率:192kb/s

  • 输出格式:mp3

  • 生成的声音:sound.mp3

7.将avi文件转成Mp3

ffmpeg -i son_origine.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 son_final.mp3

8.将.avi视频转成.mpg

ffmpeg -i video_origine.avi video_finale.mpg

9.将.mpg转成.avi

ffmpeg -i video_origine.mpg video_finale.avi

10.将.avi转成gif动画(未压缩)

ffmpeg -i video_origine.avi gif_anime.gif

11.合成视频和音频

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

12.将.avi转成.flv

ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv

13.将.avi转成dv

ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv

或者:

ffmpeg -i video_origine.avi -target pal-dv video_finale.dv

14.将.avi压缩成divx

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

15.将Ogg Theora压缩成Mpeg dvd

ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg

16.将.avi压缩成SVCD mpeg2

NTSC格式:

ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg

PAL格式:

ffmpeg -i video_origine.avi -target pal-svcd video_finale.mpg

17.将.avi压缩成VCD mpeg2

NTSC格式:

ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg

PAL格式:

ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg

18.多通道编码

ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2

19.从flv提取mp3

ffmpeg -i source.flv -ab 128k dest.mp3

</span></span></div></pre></pre>

<pre class="public-DraftStyleDefault-pre" data-offset-key="4sjnv-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="4sjnv-0-0"><div data-offset-key="4sjnv-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="4sjnv-0-0"><span data-text="true">-c:v libx264 c:v指定视频解码器,libx264解码器</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="jeop-0-0"><div data-offset-key="jeop-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="jeop-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="9g3mj-0-0"><div data-offset-key="9g3mj-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="9g3mj-0-0"><span data-text="true">-hls_time 3 切片间隔3秒</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="br3v6-0-0"><div data-offset-key="br3v6-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="br3v6-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="c38fb-0-0"><div data-offset-key="c38fb-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="c38fb-0-0"><span data-text="true">-hls_list_size 30 最大切片数</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="941kb-0-0"><div data-offset-key="941kb-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="941kb-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="2pn4k-0-0"><div data-offset-key="2pn4k-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="2pn4k-0-0"><span data-text="true">-hls_wrap 30 最大轮博数</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="fsft6-0-0"><div data-offset-key="fsft6-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="fsft6-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="err0o-0-0"><div data-offset-key="err0o-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="err0o-0-0"><span data-text="true">-f hls 转成m3u8格式</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="6i3kq-0-0"><div data-offset-key="6i3kq-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="6i3kq-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="1v05-0-0"><div data-offset-key="1v05-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="1v05-0-0"><span data-text="true">-force_key_frames "expr:gte(t,n_forced1)"  设置关键帧间隔,设置间隔为2秒的参数如下:-force_key_frames "expr:gte(t,n_forced2)"</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="3t5o2-0-0"><div data-offset-key="3t5o2-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="3t5o2-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="e0j5j-0-0"><div data-offset-key="e0j5j-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="e0j5j-0-0"><span data-text="true">-rtsp_transport tcp -i 强制使用TCP方式读取rtsp流</span></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="6puar-0-0"><div data-offset-key="6puar-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="6puar-0-0"><br data-text="true"/></span></div></pre><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="4nfgd-0-0"><div data-offset-key="4nfgd-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="4nfgd-0-0"><span data-text="true">-s 640x480 视频分辨率</span></span></div></pre></pre>

进入ffmpeg官网下载Win64版本,下载速度很快,下载下来就是一个压缩包,解压后就是工具本体了,不过它没有任何UI界面,在Windows下你只能进入bin目录,然后Shift+鼠标右键打开命令窗口,使用ffmpeg的指令进行操作。

下面分析网上搜集的ffmpeg简单用法,可以进行很多基础的视频编辑。

ffmpeg的简单用法

转码 最简单命令如下:

<pre class="public-DraftStyleDefault-pre" data-offset-key="dt5d4-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="dt5d4-0-0"><div data-offset-key="dt5d4-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="dt5d4-0-0"><span data-text="true">ffmpeg -i out.ogv -vcodec h264 out.mp4 ffmpeg -i out.ogv -vcodec mpeg4 out.mp4 ffmpeg -i out.ogv -vcodec libxvid out.mp4 ffmpeg -i out.mp4 -vcodec wmv1 out.wmv ffmpeg -i out.mp4 -vcodec wmv2 out.wmv

</span></span></div></pre></pre>

-i 后面是输入文件名。-vcodec 后面是编码格式,h264 最佳,但 Windows 系统默认不安装。如果是要插入 ppt 的视频,选择 wmv1 或 wmv2 基本上万无一失。 附加选项:-r 指定帧率,-s 指定分辨率,-b 指定比特率;于此同时可以对声道进行转码,-acodec 指定音频编码,-ab 指定音频比特率,-ac 指定声道数,例如

<pre class="public-DraftStyleDefault-pre" data-offset-key="8gb5b-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="8gb5b-0-0"><div data-offset-key="8gb5b-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="8gb5b-0-0"><span data-text="true">ffmpeg -i out.ogv -s 640x480 -b 500k -vcodec h264 -r 29.97 -acodec libfaac -ab 48k -ac 2 out.mp4</span></span></div></pre></pre>

剪切

用 -ss 和 -t 选项, 从第 30 秒开始,向后截取 10 秒的视频,并保存:

<pre class="public-DraftStyleDefault-pre" data-offset-key="2lfgl-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="2lfgl-0-0"><div data-offset-key="2lfgl-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="2lfgl-0-0"><span data-text="true">ffmpeg -i input.wmv -ss 00:00:30.0 -c copy -t 00:00:10.0 output.wmv ffmpeg -i input.wmv -ss 30 -c copy -t 10 output.wmv</span></span></div></pre></pre>

达成相同效果,也可以用 -ss 和 -to 选项, 从第 30 秒截取到第 40 秒:

<pre class="public-DraftStyleDefault-pre" data-offset-key="ebbtv-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="ebbtv-0-0"><div data-offset-key="ebbtv-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="ebbtv-0-0"><span data-text="true">ffmpeg -i input.wmv -ss 30 -c copy -to 40 output.wmv</span></span></div></pre></pre>

值得注意的是,ffmpeg 为了加速,会使用关键帧技术, 所以有时剪切出来的结果在起止时间上未必准确。 通常来说,把 -ss 选项放在 -i 之前,会使用关键帧技术; 把 -ss 选项放在 -i 之后,则不使用关键帧技术。 如果要使用关键帧技术又要保留时间戳,可以加上 -copyts 选项:

<pre class="public-DraftStyleDefault-pre" data-offset-key="d3sru-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="d3sru-0-0"><div data-offset-key="d3sru-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="d3sru-0-0"><span data-text="true">ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4</span></span></div></pre></pre>

合并

把两个视频文件合并成一个。

简单地使用 concat demuxer,示例:

<pre class="public-DraftStyleDefault-pre" data-offset-key="8a7es-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="8a7es-0-0"><div data-offset-key="8a7es-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="8a7es-0-0"><span data-text="true">$ cat mylist.txt file '/path/to/file1' file '/path/to/file2' file '/path/to/file3'

$ ffmpeg -f concat -i mylist.txt -c copy output</span></span></div></pre></pre>

更多时候,由于输入文件的多样性,需要转成中间格式再合成:

<pre class="public-DraftStyleDefault-pre" data-offset-key="9r42h-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="9r42h-0-0"><div data-offset-key="9r42h-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="9r42h-0-0"><span data-text="true">ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi</span></span></div></pre></pre>

调整播放速度

加速四倍:

<pre class="public-DraftStyleDefault-pre" data-offset-key="5vln4-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="5vln4-0-0"><div data-offset-key="5vln4-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="5vln4-0-0"><span data-text="true">ffmpeg -i TheOrigin.mp4 -vf "setpts=0.25*PTS" UpTheOrigin.mp4</span></span></div></pre></pre>

四倍慢速:

<pre class="public-DraftStyleDefault-pre" data-offset-key="br51d-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="br51d-0-0"><div data-offset-key="br51d-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="br51d-0-0"><span data-text="true">ffmpeg -i TheOrigin.mp4 -vf "setpts=4*PTS" DownTheOrigin.mp4</span></span></div></pre></pre>

帧率设置

使用-r选项 语法是:

<pre class="public-DraftStyleDefault-pre" data-offset-key="3u8i1-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="3u8i1-0-0"><div data-offset-key="3u8i1-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="3u8i1-0-0"><span data-text="true">ffmpeg -i input -r fps output</span></span></div></pre></pre>

例如:

<pre class="public-DraftStyleDefault-pre" data-offset-key="130fn-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="130fn-0-0"><div data-offset-key="130fn-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="130fn-0-0"><span data-text="true">ffmpeg -i input.avi -r 30 output.mp4</span></span></div></pre></pre>

使用fps filter

另一个设置帧率是用fps filter,特别是在filterchains使用时非常有用。 例如:修改输入文件的帧率到25

<pre class="public-DraftStyleDefault-pre" data-offset-key="ksos-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="ksos-0-0"><div data-offset-key="ksos-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="ksos-0-0"><span data-text="true">ffmpeg -v clip.mpg -vf fps=fps=25 clip.webm</span></span></div></pre></pre>

比特率设置

比特率也是一个决定音视频总体质量的参数。他决定每个时间单位处理的bit数。 设置比特率:

比特率决定处理1s的编码流需要多少bits,设置用-b选项。区分音视频用-b:a和-b:v 例如:设置整体1.5Mbit每秒

<pre class="public-DraftStyleDefault-pre" data-offset-key="30epl-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="30epl-0-0"><div data-offset-key="30epl-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="30epl-0-0"><span data-text="true">ffmpeg -i file.avi -b 1.5M file.mp4

ffmpeg -i input.avi -b:v 1500K output.mp4</span></span></div></pre></pre>

CBR设置 CBR设置一般用作直播流,比如视频会议。为输出设置CBR,有三个参数必须设置为同一个值。 bitrate(-b option), minimal rate(-minrate), maximal rate(-maxrate)。maximal rate需要设置-bufsize选项。例如设置CBR为0.5Mbit/s。

<pre class="public-DraftStyleDefault-pre" data-offset-key="7s41e-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="7s41e-0-0"><div data-offset-key="7s41e-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="7s41e-0-0"><span data-text="true">ffmpeg -i in.avi -b 0.5M -minrate 0.5M -maxrate 0.5M -bufsize 1M output.mkv</span></span></div></pre></pre>

设置输出文件的最大size

用-fs选项。 例如设置输出文件的最大的size为10M

<pre class="public-DraftStyleDefault-pre" data-offset-key="doe4h-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="doe4h-0-0"><div data-offset-key="doe4h-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="doe4h-0-0"><span data-text="true">ffmpeg -i input.avi -fs 10MB output.mp4</span></span></div></pre></pre>

文件大小计算

文件的大小是是音视频流大小的和。 视频流的大小的方程式是(除以8是由bits到bytes的转换):

<pre class="public-DraftStyleDefault-pre" data-offset-key="1n9gp-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="1n9gp-0-0"><div data-offset-key="1n9gp-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="1n9gp-0-0"><span data-text="true">video_size = video_bitrate * time_in_seconds / 8;</span></span></div></pre></pre>

如果音频是解压缩的,计算公式是:

<pre class="public-DraftStyleDefault-pre" data-offset-key="e6ns8-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="e6ns8-0-0"><div data-offset-key="e6ns8-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="e6ns8-0-0"><span data-text="true">audio_size = smpaling_rate bit_depth channels * time_in_second / 8;</span></span></div></pre></pre>

例如:计算10分钟的视频, 1500kbits/s 视频比特率和 128kbits/s的音频比特率,用下面的计算方法:

<pre class="public-DraftStyleDefault-pre" data-offset-key="23bou-0-0"><pre class="Editable-styled" data-block="true" data-editor="5tt5h" data-offset-key="23bou-0-0"><div data-offset-key="23bou-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="23bou-0-0"><span data-text="true">file_size = video_size + audio_size; file_size = (video_bitrate + audio_bitrate) time_in_seconds / 8; file_size = (1500 kbits/s + 128kbits/s) 600s file_size = 1628kbits/s * 600s file_size = 976800kb = 976800000 b / 8 = 122100000 B / 1024 = 119238.28125KB file_size = 119238.28125 KB / 1024 = 116.443634033203125MB = 116.44M</span></span></div></pre></pre>

原文链接:https://juejin.cn/post/7165895027866992648

使用道具 举报

随机推荐

0 回复

游客
返回顶部