FFmpeg常见命令行(五):FFmpeg滤镜使用

前言

在Android音视频开发中,网上知识点过于零碎,自学起来难度非常大,不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》,结合我自己的工作学习经历,我准备写一个音视频系列blog。本文是音视频系列blog的其中一个, 对应的要学习的内容是:如何使用FFmpeg命令行进行滤镜的处理。


音视频系列blog

音视频系列blog: 点击此处跳转查看.


目录


1 FFmpeg滤镜Filter描述格式

1.1 FFmpeg滤镜Filter的参数排列方式

在FFmpeg中,滤镜(Filters)是用于处理音频和视频流的效果和转换的工具。滤镜可以通过一系列的参数来配置其行为。参数排列方式在不同版本的FFmpeg中可能有所不同,但一般情况下,滤镜的参数可以按照以下方式排列:

bash 复制代码
ffmpeg -i input.mp4 -vf filter1=value1:param1=value2,filter2=value3:param2=value4 output.mp4

在这里,-vf 是用于指定视频滤镜的选项,后面紧跟着一系列的滤镜和参数。每个滤镜及其参数都以逗号分隔。例如,假设你想要应用一个调整亮度和对比度的滤镜,你可以这样写:

bash 复制代码
ffmpeg -i input.mp4 -vf brightness=0.5:contrast=1.2 output.mp4

这里的 brightnesscontrast 是滤镜名称,后面的数字是对应的参数值。参数之间使用冒号分隔。

如果一个滤镜有多个参数,你可以按照如下方式传递它们:

bash 复制代码
ffmpeg -i input.mp4 -vf filter_name=param1=value1:param2=value2:param3=value3 output.mp4

请注意,滤镜的参数名和取值根据具体的滤镜而定,不同的滤镜可能有不同的参数要求和命名。

对于音频滤镜,也可以使用 -af 选项来指定,参数排列方式与视频滤镜类似:

bash 复制代码
ffmpeg -i input.mp3 -af filter1=value1:param1=value2,filter2=value3:param2=value4 output.mp3

需要根据你所使用的具体滤镜的文档来了解其参数的正确排列方式。你可以通过在命令行中运行 ffmpeg -filters 来查看所有可用的滤镜及其参数。

总之,FFmpeg的滤镜参数排列方式是通过在 -vf(视频滤镜)和 -af(音频滤镜)选项后使用逗号分隔的键值对来实现的。


1.2 FFmpeg滤镜Filter时间内置变量

在FFmpeg中,滤镜(Filters)可以使用内置的时间相关变量来进行时间相关的操作。这些变量允许你在滤镜处理过程中访问和操作输入流的时间信息。以下是一些常用的时间内置变量:

  1. t:当前帧的时间戳,以秒为单位。
  2. n:当前帧的索引。
  3. pts:当前帧的显示时间戳(Presentation Timestamp)。
  4. prev_pts:前一帧的显示时间戳。
  5. start_pts:输入流的开始时间戳。
  6. prev_selected_pts:前一帧的显示时间戳,已通过滤镜选择(通常与prev_pts不同,因为可能会有帧被滤镜丢弃)。
  7. tb:时间基准(timebase),用于计算时间戳。例如,如果时间基准是1/90000,那么1个时间单位表示1/90000秒。

这些时间内置变量可以在滤镜链中使用,用于创建基于时间的效果、调整播放速度、裁剪、剪辑等操作。以下是一个简单的示例,演示如何使用时间内置变量来创建一个变速效果:

bash 复制代码
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4

在这个示例中,setpts 滤镜用于调整每一帧的显示时间戳,使其变为原来的一半,从而实现视频的两倍速播放。


2 FFmpeg为视频加水印

2.1 文字水印

在FFmpeg中为视频添加文字水印,可以使用 drawtext 滤镜。该滤镜允许你在视频中指定位置添加自定义文本,并且可以设置字体、颜色、大小等属性。以下是一个基本示例:

bash 复制代码
ffmpeg -i input.mp4 -vf "drawtext=text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white" output.mp4

在这个示例中,drawtext 滤镜被应用于输入视频。参数解释如下:

  • text:设置水印文本内容。
  • xy:指定水印的位置,以像素为单位,从左上角计算。
  • fontsize:设置字体大小。
  • fontcolor:设置字体颜色。

你可以根据需要进行调整以满足你的要求。请注意,字体和颜色的名称、路径等取决于你系统中的可用字体和颜色设置。

如果你希望水印在视频的不同时间段内逐渐出现或消失,你可以结合使用时间内置变量来实现。例如,以下示例会在视频的前5秒内淡入水印:

bash 复制代码
ffmpeg -i input.mp4 -vf "drawtext=text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white:enable='between(t,0,5)'" output.mp4

在这个示例中,enable 参数用于设置水印的显示时间范围。在上述示例中,水印会在时间范围为0到5秒内逐渐淡入。


2.2 图片水印

在FFmpeg中为视频添加图片水印,可以使用 overlay 滤镜。这个滤镜允许你将一个视频或图片叠加到另一个视频上,从而实现水印效果。以下是一个基本的示例:

bash 复制代码
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4

在这个示例中,overlay 滤镜被用于将 watermark.png 图片叠加到 input.mp4 视频上。参数解释如下:

  • overlay:指定水印的位置,以像素为单位。这里的 10:10 表示在视频的左上角添加水印。

你可以根据需要进行调整以满足你的要求。如果你想要水印在视频的不同时间段内逐渐出现或消失,你可以结合使用时间内置变量来实现,类似于之前提到的 drawtext 滤镜的方法。

另外,你可以使用 xy 参数来进一步调整水印的位置,以及使用 alpha 参数来设置水印的透明度。以下是一个更复杂的示例:

bash 复制代码
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=x=main_w-overlay_w-10:y=10:alpha=0.5" output.mp4

在这个示例中,水印被放置在视频的右上角,同时设置了透明度为0.5。


3 FFmpeg生成画中画

在FFmpeg中生成画中画效果,可以使用 overlay 滤镜。这个滤镜可以将一个视频或图片叠加到另一个视频上,从而实现画中画效果。以下是一个生成画中画效果的基本示例:

bash 复制代码
ffmpeg -i background.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=10:10[out]" -map "[out]" output.mp4

在这个示例中,background.mp4 是背景视频,overlay.mp4 是要叠加的画中画视频。overlay 滤镜将画中画视频叠加到背景视频上,并指定了叠加的位置为 (10, 10) 像素。

你可以根据需要对叠加的位置、大小、透明度等进行调整。如果你想要画中画在视频的不同时间段内逐渐出现或消失,你可以结合使用时间内置变量来实现。

另外,你还可以通过设置 xy 参数,以及使用 alpha 参数来调整叠加的位置和透明度。以下是一个更复杂的示例,生成一个放大的画中画效果:

bash 复制代码
ffmpeg -i background.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2:zoom=2:alpha=0.5[out]" -map "[out]" output.mp4

在这个示例中,zoom 参数设置为2,使得画中画视频放大两倍,同时 alpha 参数设置为0.5,使得画中画具有一定的透明度。


4 FFmpeg视频多宫格处理

要在FFmpeg中进行视频多宫格处理,也就是将多个视频并排或纵向排列在一个画面中,你可以使用 tile 滤镜。这个滤镜可以将多个输入视频分割并排列在一个画面中。以下是一个基本的示例:

bash 复制代码
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "[0:v][1:v][2:v]tile=3x1" output.mp4

在这个示例中,input1.mp4input2.mp4input3.mp4 是要合并的多个输入视频。tile 滤镜将这三个视频按照3列1行的形式排列在一起。

你可以根据需要进行调整,比如改变排列的行数和列数,以及调整间隔等。如果输入视频的大小不同,你可能还需要进行尺寸调整以确保宫格处理后的输出视频大小是一致的。

以下是一个更复杂的示例,将四个输入视频按照2行2列的形式排列,并在每个视频之间添加一些间隔:

bash 复制代码
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v][1:v][2:v][3:v]tile=2x2:margin=10" output.mp4

在这个示例中,margin 参数用于设置视频之间的间隔。


5 FFmpeg音频流滤镜操作

5.1 双声道、单声道,双音频流概念

当涉及音频处理时,双声道、单声道和双音频流是一些基本的概念。先简单的介绍一下它们:

  1. 双声道(Stereo)
    双声道是一种音频格式,它模拟了我们两只耳朵的听觉感受。你可以将其想象为音乐或声音从不同的方向传入,就像你左耳听到的声音可能略有不同于右耳听到的声音。这种分离让你能够更好地感知声音的位置和空间。在双声道音频中,通常会有两个声道,一个代表左声道,另一个代表右声道。这使得音频更具层次感和立体感。
  2. 单声道(Mono)
    单声道是一种音频格式,其中所有声音都混合在一个声道中。这意味着不会有左右声道的分离,所有声音都在一个平面上。你可以将其想象为声音似乎来自于一个唯一的方向。单声道通常用于广播、电话等场景,因为它更简单且易于处理。
  3. 双音频流
    双音频流是指一个视频文件中包含两个独立的音频流。这两个音频流可以分别是不同的声道,例如一个用于音乐,另一个用于配音。当你播放这样的视频时,你通常可以在设置中选择要听的音频流,或者在播放时切换音频流。这在多语言环境或者需要混合不同声音的情况下非常有用。

总之,双声道提供了立体声音的感觉,单声道将所有声音混合在一起,而双音频流则允许在一个视频中包含多个独立的音频流。这些概念有助于我们更好地理解和处理不同类型的音频。


5.2 双声道合并单声道

在FFmpeg中,可以使用 amix 音频滤镜来将两个单声道音频流合并成一个双声道音频流。这个滤镜允许你在时间上混合多个音频流。以下是一个将两个单声道音频合并成双声道音频的示例:

bash 复制代码
ffmpeg -i input_mono1.wav -i input_mono2.wav -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=2" output_stereo.wav

在这个示例中,input_mono1.wavinput_mono2.wav 是两个单声道音频文件。amix 滤镜将这两个音频流合并成一个双声道音频文件。

参数解释如下:

  • inputs:设置输入的音频流数量,这里是2。
  • duration:指定合并后音频流的持续时间,这里选择第一个输入流的持续时间。
  • dropout_transition:设置混合过渡的时间,这里是2秒。这个参数可以调整,以平滑地过渡从一个声道到另一个声道。

你可以根据需要进行调整,以适应不同的音频文件和要求。请注意,amix 滤镜适用于将单声道音频合并成双声道音频。


5.3 双声道提取

在FFmpeg中,可以使用 pan 音频滤镜来从双声道音频流中提取单声道音频。这个滤镜允许你调整声道的分布,从而提取所需的声道。以下是一个将双声道音频中的左声道提取为单声道音频的示例:

bash 复制代码
ffmpeg -i input_stereo.wav -filter_complex "[0:a]pan=1c|c0=c0[a]" -map "[a]" output_mono_left.wav

在这个示例中,input_stereo.wav 是一个双声道音频文件。pan 滤镜将左声道提取为一个单声道音频文件。

参数解释如下:

  • pan:指定声道的调整。这里使用 1c|c0=c0 来提取左声道的内容。
  • -map:用于选择滤镜处理后的音频流。

可以根据需要进行调整,以提取右声道或者其他声道的内容。


5.4 双声道转双音频流

在FFmpeg中,可以使用 channelsplit 音频滤镜来将双声道音频流拆分为两个独立的音频流,从而生成双音频流。以下是一个将双声道音频流转换为双音频流的示例:

bash 复制代码
ffmpeg -i input_stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo[a1][a2]" -map "[a1]" output_left.wav -map "[a2]" output_right.wav

在这个示例中,input_stereo.wav 是一个双声道音频文件。channelsplit 滤镜将左声道和右声道拆分为两个独立的音频流。

参数解释如下:

  • channelsplit:用于拆分声道。
  • channel_layout:指定拆分的声道布局。这里使用 stereo 表示双声道。

通过 -map 参数,可以将拆分后的左声道音频流和右声道音频流分别保存到不同的输出文件中。


5.5 单声道转双声道

在FFmpeg中,可以使用 pan 音频滤镜来将单声道音频流转换为双声道音频流。这个滤镜可以让你在不同的声道中复制或调整声音。以下是一个将单声道音频转换为双声道音频的示例:

bash 复制代码
ffmpeg -i input_mono.wav -filter_complex "[0:a]pan=stereo|c0=c0|c1=c0[a]" -map "[a]" output_stereo.wav

在这个示例中,input_mono.wav 是一个单声道音频文件。pan 滤镜将单声道音频转换为双声道音频,其中左声道和右声道都使用单声道音频的内容。

参数解释如下:

  • pan:用于调整声道分布。这里使用 stereo|c0=c0|c1=c0 来复制单声道的内容到左右声道。

通过 -map 参数,可以将处理后的双声道音频流保存到输出文件中。


5.6 两个音频源合并双声道

在FFmpeg中,可以使用 amerge 音频滤镜来将两个音频源合并成一个双声道音频流。这个滤镜用于将多个音频流混合在一起。以下是一个将两个音频源合并为双声道音频的示例:

bash 复制代码
ffmpeg -i input_audio1.wav -i input_audio2.wav -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" output_stereo.wav

在这个示例中,input_audio1.wavinput_audio2.wav 是两个音频文件。amerge 滤镜将这两个音频流混合成一个双声道音频文件。

参数解释如下:

  • amerge:用于混合音频流。
  • inputs:指定输入的音频流数量,这里是2。

通过 -map 参数,可以将混合后的双声道音频流保存到输出文件中。


5.7 多个音频合并为多声道

在FFmpeg中,可以使用 amerge 音频滤镜来将多个音频合并成一个多声道音频流。这个滤镜允许你将多个音频流混合在一起,生成具有多个声道的音频。以下是一个将三个音频源合并为一个三声道音频的示例:

bash 复制代码
ffmpeg -i input_audio1.wav -i input_audio2.wav -i input_audio3.wav -filter_complex "[0:a][1:a][2:a]amerge=inputs=3[a]" -map "[a]" output_3channel.wav

在这个示例中,input_audio1.wavinput_audio2.wavinput_audio3.wav 是三个音频文件。amerge 滤镜将这三个音频流混合成一个三声道音频文件。

参数解释如下:

  • amerge:用于混合音频流。
  • inputs:指定输入的音频流数量,这里是3。

通过 -map 参数,你可以将混合后的多声道音频流保存到输出文件中。请注意,混合多个音频为多声道时,确保输入的音频文件的声道数和声道布局是一致的,这样才能得到正确的多声道音频。


6 FFmpeg音频音量探测

6.1 音频音量获得

在FFmpeg中,可以使用 volumedetect 音频滤镜来探测音频的音量级别。这个滤镜允许你获取音频流的音量信息,以便进一步分析或处理。以下是一个获取音频音量的示例:

bash 复制代码
ffmpeg -i input_audio.wav -af "volumedetect" -vn -f null /dev/null

在这个示例中,input_audio.wav 是音频文件。volumedetect 滤镜会分析音频流的音量信息。

参数解释如下:

  • -af "volumedetect":将 volumedetect 滤镜应用于音频流。
  • -vn:禁用视频流。
  • -f null /dev/null:将输出重定向到空设备,因为我们只关心音量信息而不需要实际输出文件。

运行命令后,你会在输出中看到类似以下的信息:

bash 复制代码
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] mean_volume: -24.0 dB
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] max_volume: -15.0 dB
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] histogram_15db: 5
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] histogram_14db: 11

这些行中的 mean_volume 是平均音量的值,max_volume 是最大音量的值。值越小,音量越低。你可以根据需要将这些值用于进一步的音量分析或处理。

请注意,音量值是以负分贝(dB)为单位表示的。如果需要将这些值转换为正分贝或其他音量单位,可以使用相应的数学转换公式。


6.2 绘制音频波形

要在FFmpeg中绘制音频波形,可以使用 showwaves 音频滤镜。这个滤镜允许你在视频中绘制音频波形图,以可视化音频的振幅变化。以下是一个绘制音频波形的示例:

bash 复制代码
ffmpeg -i input_audio.wav -filter_complex "[0:a]showwaves=s=1280x720:colors=red:mode=line" -frames:v 1 output_waveform.png

在这个示例中,input_audio.wav 是音频文件。showwaves 滤镜将在一个帧中绘制音频波形。

参数解释如下:

  • s=1280x720:设置波形图的分辨率为1280x720像素。
  • colors=red:设置波形图的颜色为红色。
  • mode=line:设置波形图的显示模式为线性波形。

通过 -frames:v 1 参数,你可以生成一个帧,然后将波形图保存为输出图片文件 output_waveform.png

运行命令后,你会得到一个绘制了音频波形的图片文件。请注意,showwaves 滤镜提供了许多其他的参数和选项,你可以根据需要进行调整以获得不同的波形效果。如果想要在视频中绘制音频波形,可以使用类似的方法,只需将滤镜应用到视频流而不是图像帧上。


7 FFmpeg为视频加字幕

7.1 什么是ASS字幕流

ASS字幕流是一种高级的字幕格式,全名是"Advanced SubStation Alpha"。它与普通的字幕文件(如SRT格式)相比,提供了更多的样式和特效选项,使字幕看起来更加漂亮和富有创意。

想象一下,你在看电影或视频时,会出现在屏幕上方或下方的文字,这些文字是为了帮助你理解说话内容或提供其他信息的。ASS字幕就是一种能够让这些文字变得更丰富多彩的方式。

ASS字幕流不仅可以显示文字,还可以调整字幕的字体、颜色、大小、位置等。甚至可以为字幕添加动画、渐变效果、阴影和描边,让字幕看起来更生动。这就像是在电影中添加了一层视觉效果,让字幕更好看、更有趣。

因此,ASS字幕流是一种让电影和视频中的字幕更有个性、更具吸引力的方式,通过使用它,字幕可以成为视频内容的一部分,增加了观众的体验。


7.2 ASS字幕流写入视频流

在FFmpeg中,要将ASS字幕流写入视频流,可以使用 ass 滤镜。这个滤镜可以将ASS字幕叠加到视频上,使得字幕成为视频的一部分。以下是一个将ASS字幕流写入视频流的示例:

bash 复制代码
ffmpeg -i input.mp4 -vf "ass=subtitle.ass" output_with_subtitles.mp4

在这个示例中,input.mp4 是视频文件,subtitle.ass 是ASS字幕文件。ass 滤镜将ASS字幕叠加到视频上。

参数解释如下:

  • subtitle.ass:指定ASS字幕文件的路径和名称。

你可以根据需要调整字幕的样式、位置、字体、大小等,这些都可以在ASS字幕文件中设置。要了解更多关于ASS字幕文件的设置和样式,你可以查阅相关的ASS字幕格式文档。

请注意,ASS字幕文件需要符合ASS字幕格式,这种格式允许你在字幕文件中指定字幕的样式、特效和动画。


7.3 ASS字幕流写入封装容器

将ASS字幕流写入封装容器(例如MKV、MP4)需要使用一些特殊的选项。在FFmpeg中,可以使用 -c:s 参数来指定字幕流的编码器,并使用 -scodec 参数来指定字幕流的编码器类型。以下是一个将ASS字幕流写入MKV封装容器的示例:

bash 复制代码
ffmpeg -i input.mp4 -i subtitle.ass -c:s mov_text output_with_subtitles.mkv

在这个示例中,input.mp4 是视频文件,subtitle.ass 是ASS字幕文件。-c:s mov_text 参数指定使用 mov_text 编码器来写入字幕流。

要将字幕写入其他封装容器,你可以更换 -c:s 参数中的编码器类型。例如,对于MP4封装容器,你可以使用 srt 编码器:

bash 复制代码
ffmpeg -i input.mp4 -i subtitle.ass -c:s srt output_with_subtitles.mp4

参数解释如下:

  • -c:s:用于指定字幕流的编码器。
  • mov_textsrt:分别是MKV和MP4封装容器所使用的字幕编码器。

通过这样的方式,可以将ASS字幕流写入封装容器中。​


8 FFmpeg视频抠图合并

抠图合并是指将一个视频中的某个部分(如人物、物体等)抠出,然后将其合并到另一个视频或背景中。这通常用于实现特殊效果,比如把一个人物放到不同的背景中,创造出虚拟场景。

要在FFmpeg中实现视频抠图合并,通常需要以下步骤:

  1. 视频抠图 :首先,你需要通过使用类似于 chromakeycolorkey 滤镜来抠出视频中的部分。这些滤镜可以根据颜色信息将特定颜色范围的区域抠出。例如,如果你要抠出一个绿色背景的人物,你可以使用 chromakey 滤镜。
  2. 背景视频:你需要准备一个背景视频,这是抠出的部分将要合并的地方。
  3. 合并 :使用 overlay 滤镜将抠出的部分叠加到背景视频上。这个滤镜可以控制叠加的位置、大小等。

以下是一个基本的示例,展示了如何将抠图后的人物叠加到背景视频中:

bash 复制代码
ffmpeg -i person.mp4 -i background.mp4 -filter_complex "[0:v]chromakey=green:0.1:0.2 [chroma]; [1:v][chroma]overlay[out]" -map "[out]" output_merged.mp4

在这个示例中,person.mp4 是包含绿色背景的人物视频,background.mp4 是背景视频。chromakey 滤镜用于抠图,然后使用 overlay 滤镜将抠图后的人物叠加到背景上。


9 FFmpeg 3D视频处理

9.1 stereo3d处理3D视频

在FFmpeg中,可以使用 stereo3d 滤镜来处理3D视频,包括将单个视频转换为3D格式、调整3D效果以及将3D视频转换回2D。以下是一些 stereo3d 滤镜的用法示例:

  1. 将单个视频转换为3D格式
bash 复制代码
ffmpeg -i input.mp4 -vf "stereo3d=al:sbsl" output_3d.mp4

在这个示例中,input.mp4 是输入视频文件。stereo3d 滤镜将视频转换为3D格式。参数 al:sbsl 表示将左眼图像放在左边,右眼图像放在右边。

  1. 调整3D效果

你可以使用不同的参数来调整3D效果,例如调整眼距和视差。下面是一个示例:

bash 复制代码
ffmpeg -i input_3d.mp4 -vf "stereo3d=sbsr:eyepar=4:width=1920" output_adjusted_3d.mp4

在这个示例中,input_3d.mp4 是一个3D视频文件。stereo3d 滤镜使用参数 sbsr 表示将右眼图像放在左边,eyepar 参数用于调整眼距,width 参数指定输出视频的宽度。

  1. 将3D视频转换回2D

如果你想将3D视频转换回2D,你可以使用以下示例:

bash 复制代码
ffmpeg -i input_3d.mp4 -vf "stereo3d=abl" output_2d.mp4

在这个示例中,input_3d.mp4 是一个3D视频文件。stereo3d 滤镜使用参数 abl 表示只保留左眼图像,从而将3D视频转换为2D。

请注意,stereo3d 滤镜有许多不同的参数,可以用于不同的3D效果和转换。


9.2 3D图像转换举例

在FFmpeg中,可以使用 stereo3d 滤镜来处理3D图像,包括将单个图像转换为3D格式、调整3D效果以及将3D图像转换回2D。以下是一些 stereo3d 滤镜的用法示例:

  1. 将单个图像转换为3D格式
bash 复制代码
ffmpeg -i input.jpg -vf "stereo3d=al:sbsl" output_3d.jpg

在这个示例中,input.jpg 是输入图像文件。stereo3d 滤镜将图像转换为3D格式。参数 al:sbsl 表示将左眼图像放在左边,右眼图像放在右边。

  1. 调整3D效果

你可以使用不同的参数来调整3D效果,例如调整眼距和视差。下面是一个示例:

bash 复制代码
ffmpeg -i input_3d.jpg -vf "stereo3d=sbsr:eyepar=4:width=1920" output_adjusted_3d.jpg

在这个示例中,input_3d.jpg 是一个3D图像文件。stereo3d 滤镜使用参数 sbsr 表示将右眼图像放在左边,eyepar 参数用于调整眼距,width 参数指定输出图像的宽度。

  1. 将3D图像转换回2D

如果你想将3D图像转换回2D,你可以使用以下示例:

bash 复制代码
ffmpeg -i input_3d.jpg -vf "stereo3d=abl" output_2d.jpg

在这个示例中,input_3d.jpg 是一个3D图像文件。stereo3d 滤镜使用参数 abl 表示只保留左眼图像,从而将3D图像转换为2D。

这些示例演示了如何在FFmpeg中使用 stereo3d 滤镜来处理3D图像,可以根据需要进行调整。


10 FFmpeg定时视频截图

10.1 vframe参数截取一张图片

在FFmpeg中,可以使用 -vframes 参数来指定要截取的帧数,从而截取视频中的一张或多张图片。以下是一个截取一张图片的示例:

bash 复制代码
ffmpeg -i input.mp4 -vframes 1 output.jpg

在这个示例中,input.mp4 是输入视频文件,output.jpg 是输出图片文件。-vframes 1 参数表示只截取一帧,即一张图片。

如果你想要在特定的时间点截取一张图片,你可以使用 -ss 参数来指定时间点。例如,要在视频的第10秒处截取一张图片,可以这样做:

bash 复制代码
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpg

在这个示例中,-ss 00:00:10 参数表示从视频的第10秒开始截取。

请注意,使用 -vframes 参数来截取图片会非常快速,因为它只截取指定数量的帧而不需要完整地解码整个视频。这使得截取图片变得非常高效。

如果你想要截取多张图片,只需将 -vframes 参数的值设置为所需的帧数即可。


10.2 fps滤镜定时获得图片

要在特定的时间间隔内从视频中定时获取图片,可以使用 fps 滤镜。这个滤镜允许你以指定的帧率从视频流中获取帧,然后保存为图片。以下是一个根据指定的帧率定时获取图片的示例:

bash 复制代码
ffmpeg -i input.mp4 -vf "fps=1/5" -vsync 0 output_%03d.jpg

在这个示例中,input.mp4 是输入视频文件。fps=1/5 滤镜指定了帧率为每秒5帧,这样就会定时每隔0.2秒从视频中获取一帧。-vsync 0 参数禁用了同步帧处理,以确保准确的帧率。

output_%03d.jpg 表示输出图片的文件名,%03d 表示用三位数字来编号输出图片文件。这会生成类似 output_001.jpgoutput_002.jpg 等的文件名。

通过这个命令,你将会定时每隔0.2秒从视频中获取一帧,并将其保存为图片。你可以根据需要调整帧率、文件名模式和输出图片格式。

如果你需要更多的定时控制,你也可以结合使用 -ss 参数来指定起始时间点。例如,要从视频的第10秒开始,每隔1秒获取一帧,你可以这样做:

bash 复制代码
ffmpeg -i input.mp4 -vf "fps=1" -ss 10 -vsync 0 output_%03d.jpg

通过调整参数,你可以实现不同时间间隔的定时截图操作。


11 FFmpeg生成测试元数据

11.1 FFmpeg生成音频测试流

要在FFmpeg中生成音频测试流,可以使用 aevalsrc 音频滤镜。这个滤镜允许你生成包含特定音频模式和声音的音频流。以下是一个生成音频测试流的示例:

bash 复制代码
ffmpeg -f lavfi -i "aevalsrc=sin(400*2*PI*t):d=5" -c:a pcm_s16le output.wav

在这个示例中,aevalsrc 滤镜用于生成一个包含正弦波的音频流。参数解释如下:

  • sin(400*2*PI*t):这是正弦波的表达式,其中 400 是频率(赫兹),2*PI 是周期,t 是时间。
  • d=5:表示音频持续时间为5秒。

通过 -c:a pcm_s16le 参数,你可以指定音频流的编码格式为16位线性PCM。最后,将生成的音频流保存为输出文件 output.wav

这个示例生成了一个包含特定频率和持续时间的音频测试流。


11.2 FFmpeg生成视频测试流

要在FFmpeg中生成视频测试流,可以使用 testsrc 视频源滤镜。这个滤镜允许你生成不同类型的测试图像和图案,用于视频流的测试和调试。以下是一个生成视频测试流的示例:

bash 复制代码
ffmpeg -f lavfi -i testsrc=duration=5:size=1280x720:rate=30 output.mp4

在这个示例中,testsrc 滤镜用于生成一个测试视频流。参数解释如下:

  • duration=5:表示视频的持续时间为5秒。
  • size=1280x720:设置视频分辨率为1280x720像素。
  • rate=30:设置视频帧率为30帧/秒。

通过 -f lavfi 参数,你可以指定输入为lavfi(libavfilter)源。最后,将生成的视频流保存为输出文件 output.mp4

这个示例生成了一个包含测试图像的视频测试流。你可以根据需要调整分辨率、帧率和其他参数来生成不同类型的测试图像。 ​


12 FFmpeg对音视频倍速处理

12.1 atempo音频倍速处理

在FFmpeg中,你可以使用 atempo 音频滤镜来进行音频的倍速处理,即加快或减慢音频的播放速度。这个滤镜可以用于在不改变音调的情况下调整音频的播放速度。以下是一个使用 atempo 滤镜的示例:

bash 复制代码
ffmpeg -i input.mp3 -filter:a "atempo=1.5" output_fast.mp3

在这个示例中,input.mp3 是输入音频文件。atempo=1.5 滤镜参数表示将音频的播放速度加快到原速度的1.5倍。

如果你想要将音频的播放速度减慢,可以使用小于1的值,例如 atempo=0.8 表示将音频的播放速度减慢到原速度的0.8倍。

请注意,使用 atempo 滤镜可以改变音频的播放速度,但不会改变音频的音调。但是,过于快速或减慢音频可能会导致音频失真或质量下降,所以在调整倍速时需要注意音质。 ​


12.2 setpts视频倍速处理

在FFmpeg中,可以使用 setpts 视频滤镜来进行视频的倍速处理,即加快或减慢视频的播放速度。这个滤镜可以用于在不改变音频的情况下调整视频的播放速度。以下是一个使用 setpts 滤镜的示例:

bash 复制代码
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output_fast.mp4

在这个示例中,input.mp4 是输入视频文件。setpts=0.5*PTS 滤镜参数表示将视频的播放速度加快到原速度的2倍(0.5倍的PTS意味着播放速度加快为2倍)。

如果你想要将视频的播放速度减慢,可以使用大于1的值,例如 setpts=2*PTS 表示将视频的播放速度减慢为原速度的一半。

需要注意的是,使用 setpts 滤镜可以改变视频的播放速度,但不会改变音频的播放速度。

相关推荐
Fre丸子_6 小时前
ffmpeg之播放一个yuv视频
ffmpeg·音视频
yinqinggong8 小时前
从源码编译支持FFmpeg的OpenCV
opencv·ffmpeg
冰山一脚20139 小时前
ffmpeg添加sps,pps
ffmpeg
嘟嘟实验室1 天前
微信小程序xr-frame透明视频实现
微信小程序·ffmpeg·音视频·xr
泰勒朗斯1 天前
如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到
linux·opencv·ffmpeg
-Mr_X-2 天前
windows下srs流媒体服务器使用ffmpeg推流
ffmpeg
dvlinker2 天前
C++开源项目 VLC 源代码的交叉编译以及库的裁剪方法详解
ffmpeg·mingw-w64·msys2·cygwin·开源vlc·vlc编译·vlc裁剪
因我你好久不见2 天前
springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
java·spring boot·ffmpeg
cuijiecheng20183 天前
音视频入门基础:MPEG2-TS专题(21)——FFmpeg源码中,获取TS流的视频信息的实现
ffmpeg·音视频
cuijiecheng20183 天前
音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
ffmpeg·音视频·aac