FFMPEG学习任务

任务 1: 查看媒体信息 (侦察)
  • 目的: 学会使用 ffprobe 分析文件。
  • 命令: ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
  • 分析 : 查看输出的 JSON。找到视频流(codec_type: "video")和音频流(codec_type: "audio"),记下它们的编码格式(codec_name,如 h264, aac)、分辨率(width, height)、时长(duration)。
    1. ffprobe:FFmpeg 套件中的媒体信息分析工具,用于提取视频、音频文件的元数据(如编码格式、分辨率、比特率等)。
    2. -v quiet:设置日志级别为 "安静模式",不输出任何冗余日志(只返回结果数据)。
    3. -print_format json:指定输出格式为 JSON,方便程序解析(默认是文本格式)。
    4. -show_format :显示媒体文件的整体格式信息(如文件大小、时长、比特率等)。
    5. -show_streams :显示文件中每个流的详细信息(视频流、音频流、字幕流等各自的参数)。
    6. input.mp4:目标媒体文件路径(可以是本地文件或网络流地址,如 HTTP-FLV、HLS 等)。
json 复制代码
"streams": [
        {
            "index": 0,
            "codec_name": "mpeg4",
            "codec_long_name": "MPEG-4 part 2",
            "profile": "Simple Profile",
            "codec_type": "video",
            "codec_tag_string": "mp4v",
            "codec_tag": "0x7634706d",
            "width": 1440,
            "height": 1080,
            "coded_width": 1440,
            "coded_height": 1080,
            "closed_captions": 0,
            "film_grain": 0,
            "has_b_frames": 0,
            "sample_aspect_ratio": "1:1",
            "display_aspect_ratio": "4:3",
            "pix_fmt": "yuv420p",
            "level": 1,
            "chroma_location": "left",
            "refs": 1,
            "quarter_sample": "false",
            "divx_packed": "false",
            "id": "0x1",
            "r_frame_rate": "15/1",
            "avg_frame_rate": "15/1",
            "time_base": "1/15360",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 1761280,
            "duration": "114.666667",
            "bit_rate": "1199423",
            "nb_frames": "1720",
            "extradata_size": 47,
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0,
                "timed_thumbnails": 0,
                "non_diegetic": 0,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0,
                "multilayer": 0
            },
            "tags": {
                "language": "und",
                "handler_name": "VideoHandler",
                "vendor_id": "[0][0][0][0]",
                "encoder": "Lavc61.19.101 mpeg4"
            }
        },
        {
            "index": 1,
            "codec_name": "aac",
            "codec_long_name": "AAC (Advanced Audio Coding)",
            "profile": "LC",
            "codec_type": "audio",
            "codec_tag_string": "mp4a",
            "codec_tag": "0x6134706d",
            "sample_fmt": "fltp",
            "sample_rate": "44100",
            "channels": 2,
            "channel_layout": "stereo",
            "bits_per_sample": 0,
            "initial_padding": 0,
            "id": "0x2",
            "r_frame_rate": "0/0",
            "avg_frame_rate": "0/0",
            "time_base": "1/44100",
            "start_pts": 0,
            "start_time": "0.000000",
            "duration_ts": 5052405,
            "duration": "114.567007",
            "bit_rate": "121564",
            "nb_frames": "4935",
            "extradata_size": 5,
            "disposition": {
                "default": 1,
                "dub": 0,
                "original": 0,
                "comment": 0,
                "lyrics": 0,
                "karaoke": 0,
                "forced": 0,
                "hearing_impaired": 0,
                "visual_impaired": 0,
                "clean_effects": 0,
                "attached_pic": 0,
                "timed_thumbnails": 0,
                "non_diegetic": 0,
                "captions": 0,
                "descriptions": 0,
                "metadata": 0,
                "dependent": 0,
                "still_image": 0,
                "multilayer": 0
            },
            "tags": {
                "language": "und",
                "handler_name": "SoundHandler",
                "vendor_id": "[0][0][0][0]"
            }
        }
    ],
    "format": {
        "filename": "test.mp4",
        "nb_streams": 2,
        "nb_programs": 0,
        "nb_stream_groups": 0,
        "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
        "format_long_name": "QuickTime / MOV",
        "start_time": "0.000000",
        "duration": "114.666667",
        "size": "18981220",
        "bit_rate": "1324271",
        "probe_score": 100,
        "tags": {
            "major_brand": "isom",
            "minor_version": "512",
            "compatible_brands": "isomiso2mp41",
            "encoder": "Lavf61.7.100",
            "description": "Bilibili VXCode Swarm Transcoder r0.2.61(gap_fixed:False)"
        }
    }
}
任务 2: 快速转封装 (不重新编码)
  • 目的: 理解转封装和转码的区别,感受 copy 的速度。

  • 命令 1 (MP4 -> MKV): ffmpeg -i input.mp4 -c copy output.mkv

  • 命令 2 (MP4 -> FLV): ffmpeg -i input.mp4 -c copy output.flv

  • 观察 : 这两个命令的执行速度应该非常快(几乎是瞬时完成),因为它们只改变了"集装箱"(封装格式),没有动里面的"货物"(音视频编码数据)。

    1. ffmpeg:FFmpeg 工具的主命令,用于音视频处理(转码、格式转换、剪辑等)。
    2. -i input.mp4-i 是输入文件参数,指定源文件为 input.mp4(可以是本地文件或网络流地址)。
    3. -c copy-c 是编码器参数,copy表示「流复制」模式 ------ 直接复制输入文件中的音视频流,不进行重新编码(速度极快,无质量损失)。
      • 等效于 -codec copy,可单独指定流类型(如 -c:v copy 仅复制视频流,-c:a copy 仅复制音频流)。
    4. output.mk :输出文件路径及名称,mk 是文件扩展名(通常建议使用标准格式扩展名如 .mp4.mkv 等,避免播放器识别问题)。

    核心特点 :由于使用 -c copy,命令执行时仅修改容器格式(封装),不触碰原始音视频数据,因此速度极快(通常几秒内完成),且完全保留原始画质和音质。

任务 3: 提取视频流 (分离)
  • 目的: 学会使用 -vn / -an。

  • 命令 (提取视频,去掉音频): ffmpeg -i input.mp4 -c:v copy -an output_video_only.mp4

  • 观察: 播放 output_video_only.mp4,它应该只有画面,没有声音。

    • ffmpeg:FFmpeg 主程序,用于音视频处理。
    • -i input.mp4-i 指定输入文件为 input.mp4
    • -c:v copy-c:v 表示视频编码器,copy 表示直接复制原始视频流(不重新编码,保留画质且速度快)。
    • -an-a 表示音频,n 表示 "无",即移除所有音频轨道(最终输出无声音)。
    • output_video_only.mp4:输出文件路径及名称,仅包含视频流。

    效果 :生成的 output_video_only.mp4 保留原视频的编码、分辨率等参数,但无任何音频,适合仅需视频画面的场景(如静音素材剪辑)。

任务 4: 提取音频流 (分离)
  • 目的: 将视频中的音频保存为独立的音乐文件。

  • 命令 (提取音频为 AAC): ffmpeg -i input.mp4 -c:a copy -vn output_audio_only.aac

  • 命令 (提取音频并转码为 MP3): ffmpeg -i input.mp4 -c:a mp3 -vn output_audio.mp3

  • 观察 : 第二个命令会比第一个慢,因为它需要对 AAC 音频进行重新编码为 MP3。

    • ffmpeg -i test.flv -c:v copy -c:a copy output.mp4
      显式指定:视频流(-c:v)和音频流(-c:a)都采用复制模式,不重新编码。
    • ffmpeg -i test.flv -c copy output.mp4
      简化写法:-c copy 等价于对所有流(视频、音频等)应用复制模式,与显式指定 -c:v copy -c:a copy 效果一致。

    注意:若原本音频不是MP3,若转成MP3

    音频,需要指定MP3编码器,如libmp3lame

    bash 复制代码
    ffmpeg -if test.flv -v:a libmp3lame -vn output_audio_only.mp3
任务 5: 视频转码 (改变编码)
  • 目的: 体验真正的编码过程。
  • 命令 (H.264 -> H.265/HEVC): ffmpeg -i input.mp4 -c:v libx265 -c:a copy output_h265.mp4
  • 观察 : 这个过程会明显变慢,你的 CPU 使用率会上升。因为 FFmpeg 正在逐帧解码 H.264,然后再用 libx265 编码器重新编码成 H.265。比较一下 output_h265.mp4 和 input.mp4 的文件大小,通常前者会更小。
任务 6: 改变分辨率 (缩放)
  • 目的: 学会使用 -vf 视频滤镜。

  • 命令 (1080p -> 720p): ffmpeg -i input.mp4 -vf "scale=1280:720" -c:a copy output_720p.mp4

  • 观察: scale 是最常用的滤镜之一。1280:720 是目标分辨率。如果想保持宽高比,可以写成 scale=1280:-1,FFmpeg 会自动计算高度。

    1. ffmpeg:FFmpeg 主程序,用于音视频处理。
    2. -i input.mp4-i 指定输入文件为 input.mp4
    3. `-vf "scale=1280:720" :
      • -vf 表示视频滤镜(video filter),用于对视频进行处理。
      • scale=1280:720 是缩放滤镜,将视频分辨率强制调整为 1280 像素(宽)×720 像素(高)(即 720P 标准分辨率)。
      • 注意:如果原始视频的宽高比与 1280:720(16:9)不符,直接使用此参数可能导致画面拉伸。如需保持比例,可改为 scale=1280:-2(自动计算高度,确保比例不变,-2 表示取偶数避免兼容性问题)。
    4. -c:a copy-c:a 表示音频编码器,copy 表示直接复制原始音频流(不重新编码,保留音质且速度快)。
    5. output_720p.mp4:输出文件路径及名称,分辨率为 720P,音频与原文件一致。

    注意:滤镜有

    bash 复制代码
    1.缩放(scale)调整视频分辨率,支持按比例缩放。
    # 缩放到 1280x720(720P)
    -vf "scale=1280:720"
    # 按宽度等比缩放(高度自动计算,确保为偶数)
    -vf "scale=1280:-2"
    # 按高度等比缩放(宽度自动计算)
    -vf "scale=-2:720"
    
    2.裁剪(crop)截取视频的部分区域,格式:crop=宽:高:起始X坐标:起始Y坐标。
    # 从(100,50)开始,截取 800x600 的区域
    -vf "crop=800:600:100:50"
    # 居中裁剪为正方形(假设原始宽>高)
    -vf "crop=ih:ih"  # ih 表示原始高度,iw 表示原始宽度
    
    3.旋转(rotate)旋转视频画面(单位:弧度或角度,角度需加 deg 后缀)。
    # 顺时针旋转 90 度
    -vf "rotate=90deg"
    # 逆时针旋转 45 度
    -vf "rotate=-45deg"
    
    4.翻转(flip)水平 / 垂直翻转画面。
    # 水平翻转(左右颠倒)
    -vf "hflip"
    # 垂直翻转(上下颠倒)
    -vf "vflip"
    
    5.帧率调整(fps)改变视频帧率(如将 30FPS 转为 24FPS)。
    -vf "fps=24"
    
    6.速度调整(setpts)改变播放速度(需配合音频滤镜 atempo 同步音频)。
    # 2倍速播放(视频)
    -vf "setpts=0.5*PTS"
    # 0.5倍速播放(视频)
    -vf "setpts=2*PTS"
    
    7.添加水印(overlay)在视频上叠加图片或另一视频(水印),格式:overlay=X坐标:Y坐标。
    # 在右上角添加水印(距离右边界20px,上边界20px)
    -vf "overlay=W-w-20:H-h-20"  # W=视频宽度,w=水印宽度;H=视频高度,h=水印高度
    # 在中心添加水印
    -vf "overlay=(W-w)/2:(H-h)/2"
    
    8.画中画(overlay 进阶)叠加另一个视频作为小窗口。
    # 将 input2.mp4 作为小窗口叠加在 input1.mp4 的右下角
    ffmpeg -i input1.mp4 -i input2.mp4 -vf "overlay=W-w-10:H-h-10" output.mp4
    
    9.亮度 / 对比度 / 饱和度(eq)调整色彩参数(值范围:0-10,默认 1)。
    # 提高亮度(1.2倍),降低对比度(0.8倍)
    -vf "eq=brightness=0.2:contrast=0.8"
    
    10.灰度化(hue)将彩色视频转为黑白。
    -vf "hue=s=0"  # s=0 表示饱和度为0
    
    11.锐化 / 模糊(unsharp/blur)增强或减弱画面细节。
    # 锐化(强度5,半径1)
    -vf "unsharp=5:1"
    # 模糊(半径3, sigma值1)
    -vf "blur=3:1"
    
    12.添加文本(drawtext)在视频上叠加文字(需指定字体文件路径)
    # 在左上角添加红色文字(大小24,距离边距10px)
    -vf "drawtext=fontfile=/path/to/font.ttf:text='Hello':fontsize=24:fontcolor=red:x=10:y=10"
    
    13.嵌入字幕(subtitles)将字幕文件(如 .srt)嵌入视频。
    -vf "subtitles=subtitle.srt"
任务 7: 改变码率 (控制清晰度和大小)
  • 目的: 学会使用 -b:v 控制视频质量。
  • 命令 (压缩视频到 1Mbps): ffmpeg -i input.mp4 -b:v 1M -c:a copy output_1mbps.mp4
  • 观察 : 1M 代表 1 Mbps (兆比特每秒)。你可以试试 500K (500 Kbps)。码率越低,文件越小,但画面质量(特别是动态场景)会越差,可能会出现马赛克。
    • ffmpeg:FFmpeg 主程序,用于音视频处理。
    • -i input.mp4-i 指定输入文件为 input.mp4
    • -b:v 1M
      • -b:v 表示视频比特率(video bitrate),1M 表示设置视频流的比特率为 1Mbps(1000kbps)。
      • 这是一种 "目标比特率" 控制方式,FFmpeg 会尽量将视频平均码率控制在 1Mbps 左右(实际可能有波动)。
    • -c:a copy-c:a 表示音频编码器,copy 表示直接复制原始音频流(不重新编码,保留音质和原始码率)。
    • output_1mbps.mp4:输出文件路径及名称,视频码率约为 1Mbps,音频与原文件一致。
任务 8: 截取视频片段
  • 目的: 学会使用 -ss 和 -t / -to。
  • 命令 (从第10秒开始,截取5秒): ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -c copy output_clip.mp4
  • 解释 : -ss 指定开始时间,-t 指定持续时长。使用 -c copy 会非常快,但可能在非关键帧处截断不精确。如果想精确截取,去掉 -c copy 让其重新编码。
    • ffmpeg:FFmpeg 主程序,用于音视频处理。
    • -i input.mp4-i 指定输入文件为 input.mp4
    • -ss 00:00:10
      • -ss 表示 "开始时间",00:00:10 表示从视频的第 10 秒处开始截取(格式为 时:分:秒)。
      • 若放在 -i 之前(如 ffmpeg -ss 10 -i input.mp4 ...),截取速度会更快(利用关键帧定位),但精度可能稍低;放在 -i 之后则精度更高,适合精确截取。
    • -t 5
      • -t 表示 "截取时长",5 表示截取 5 秒的内容(最终片段时长为 5 秒)。
      • 也可用 -to 指定结束时间(如 -to 00:00:15 表示截取到第 15 秒,与 -ss 10 -t 5 效果相同)。
    • -c copy-c 表示编码器,copy 表示直接复制输入文件的音视频流(不重新编码),因此速度极快,且完全保留原始画质音质。
    • output_clip.mp4:输出文件路径及名称,为截取后的 5 秒视频片段。
任务 9: 视频截图
  • 目的: 从视频中抓取一帧作为封面图。
  • 命令 (在第5秒截一张图): ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 output_thumbnail.jpg
  • 命令从第十秒开始,每隔一秒的第一帧截取一张:ffmpeg -i test.flv -ss 00:00:10 -r 1 -vframes 3 thubm.jpg
  • 解释 : -vframes 1 表示只处理 1 帧视频就停止。
    • ffmpeg:FFmpeg 主程序,用于音视频处理。
    • -i input.mp4-i 指定输入文件为 input.mp4
    • -ss 00:00:05-ss 表示 "开始时间",00:00:05 表示定位到视频的第 5 秒处(精确到秒)。
    • -vframes 1-vframes 表示 "视频帧数",1 表示只截取 1 帧画面(即 1 张图片)。
    • output_thumbnail.jpg:输出文件路径及名称,格式为 JPG 图片(FFmpeg 会根据扩展名自动选择输出格式)。
任务 10: 添加文字水印
  • 目的: 学习更复杂的 -vf 滤镜链。

  • 命令:

    bash 复制代码
    ffmpeg -i input.mp4 -vf "drawtext=text='Hello FFmpeg':fontcolor=white:fontsize=48:x=(w-text_w)/2:y=(h-text_h)/2" -c:a copy output_watermarked.mp4
  • 解释: drawtext 是一个强大的滤镜。这段命令的意思是在视频中央绘制白色的、48像素大小的文字 "Hello FFmpeg"。

任务 11: 视频变速播放
  • 目的: 学习使用 setpts 滤镜来改变视频的播放速度。
  • 命令 (2倍速播放): ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -an output_fast.mp4
  • 命令 (0.5倍速慢放) : ffmpeg -i input.mp4 -vf "setpts=2.0*PTS" -an output_slow.mp4
    (注意: 通常改变视频速度后,需要对音频也做相应处理(atempo滤镜),这里为了简化,先用 -an 去掉音频)
  • 加上音频:ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output_fast.mp4

注意:音频速度范围是0.5到2.0,若是4倍速,则写两遍atempo=2.0即可,逗号隔开:ffmpeg -i input.mp4 -vf "setpts=0.25*PTS" -af "atempo=2.0,atempo=2.0" output_fast.mp4

任务 12: 视频裁剪 (Crop)
  • 目的: 从视频画面中切出一块矩形区域。

  • 命令 (从左上角(0,0)位置,裁剪出 640x360 的区域) :

    ffmpeg -i input.mp4 -vf "crop=640:360:0:0" -c:a copy output_cropped.mp4
    (crop=width:height❌y)

    -vf "crop=640:360:0:0"
    -vf 表示启用视频滤镜,这里使用 crop(裁剪)滤镜,参数格式为 crop=宽:高:起始X坐标:起始Y坐标

    • 640:裁剪后视频的宽度(像素)。
    • 360:裁剪后视频的高度(像素)。
    • 0(第一个):裁剪的起始点 X 坐标(水平方向,从左向右计算,0 表示最左侧)。
    • 0(第二个):裁剪的起始点 Y 坐标(垂直方向,从上向下计算,0 表示最顶部)。
    • 效果:从原始视频的左上角(0,0)开始,截取一个 640×360 像素的矩形区域作为输出画面。

任务 13: 视频旋转与翻转

目的: 学习 transpose 滤镜。
  • 命令 (顺时针旋转90度): ffmpeg -i input.mp4 -vf "transpose=1" -c:a copy output_rotated.mp4

    • -vf "transpose=1"-vf 表示启用视频滤镜,transpose=1 是旋转滤镜参数,其中 1 代表顺时针旋转 90 度 (其他常用值:0 逆时针旋转 90 度,2 逆时针旋转 90 度并翻转,3 顺时针旋转 90 度并翻转)。
  • 命令 (水平翻转): ffmpeg -i input.mp4 -vf "hflip" -c:a copy output_hflip.mp4

  • 命令 (垂直翻转): ffmpeg -i input.mp4 -vf "vflip" -c:a copy output_vflip.mp4

任务 14: 视频合并 (拼接)
  • 目的: 将多个视频文件拼接在一起。这需要先创建一个列表文件。

  • 步骤:

    1. 创建 mylist.txt 文件:

      复制代码
      file 'input.mp4'
      file 'output_clip.mp4'
    2. 执行拼接命令:ffmpeg -f concat -safe 0 -i mylist.txt -c copy output_concatenated.mp4

    • -f concat-f 指定输入格式,concat 表示使用 "拼接" 格式,用于合并多个媒体文件。
    • -safe 0 :关闭安全检查,允许 mylist.txt 中使用绝对路径或不同目录的文件(默认 safe=1 只允许相对路径,可能导致路径错误)。
    • -i mylist.txt-i 指定输入文件,这里的输入是 mylist.txt(一个文本文件,包含需要拼接的视频文件列表)。

    注意 :使用此命令拼接的视频文件需满足参数一致(如分辨率、编码格式、帧率等),否则可能拼接失败或播放异常。若参数不一致,需先统一格式再拼接。

任务 15: 生成 GIF 动图
  • 目的: 将视频片段转换为 GIF。

  • 命令 (截取视频前3秒,生成高画质GIF):

    bash 复制代码
    ffmpeg -i test.flv -t 3 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif

    (这个滤镜链比较复杂,它的作用是先降低帧率和分辨率,然后生成一个优化的调色板,最后用这个调色板来创建高质量的GIF)

    • -t 3 :指定只处理视频的前 3 秒(t 表示时长)。
    • -vf "...":视频滤镜链,包含多个处理步骤:
      • fps=10:将帧率设置为 10FPS(每秒 10 帧,降低 GIF 体积)。
      • scale=320:-1:flags=lanczos:将宽度缩放到 320 像素,高度按比例自动计算(-1),使用 lanczos 算法(高质量缩放)。
      • split[s0][s1]:将视频流复制为两份,分别标记为 [s0][s1]
      • [s0]palettegen[p]:用 [s0] 流生成最佳调色板(palettegen),输出标记为 [p](解决 GIF 色彩失真问题)。
      • [s1][p]paletteuse:将 [s1] 流与调色板 [p] 结合(paletteuse),生成最终 GIF。
    • -loop 0 :设置 GIF 无限循环(0 表示无限次,1 表示循环 1 次后停止)。
任务 16: 视频淡入
淡出效果
  • 目的: 学习 fade 滤镜。淡入是从黑到有画面,淡出是从有画面到无画面

  • 命令 (在前2秒淡入,最后5秒淡出):

    ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2,fade=t=out:st=25:d=5" -c:a copy output_faded.mp4

    (假设原视频时长30秒, st是开始时间, d是持续时间)

  • -vf "...":视频滤镜链,包含两个淡入淡出效果:

    复制代码
      fade=t=in:st=0:d=2:添加淡入效果
    • t=in:指定为淡入(从黑场逐渐显示画面)。
    • st=0:淡入开始时间为视频第 0 秒(起始时刻)。
    • d=2:淡入持续时间为 2 秒(第 0-2 秒完成淡入)。
    复制代码
      fade=t=out:st=25:d=5:添加淡出效果
    • t=out:指定为淡出(画面逐渐变为黑场)。
    • st=25:淡出开始时间为视频第 25 秒。
    • d=5:淡出持续时间为 5 秒(第 25-30 秒完成淡出)。

音频处理 (4 个任务)

任务 17: 替换视频的音轨
  • 目的: 将一个视频的音频换成另一个音频文件。
  • 命令 : ffmpeg -i input.mp4 -i output_audio.mp3 -c:v copy -map 0:v:0 -map 1:a:0 output_new_audio.mp4
    • -i input.mp4 :第一个输入文件,提供视频流(0 为该文件的索引)。
    • -i output_audio.mp3 :第二个输入文件,提供音频流(1 为该文件的索引)。
    • -c:v copy-c:v 指定视频编码器,copy 表示直接复制 input.mp4 的视频流(不重新编码,保留原始画质)。
    • -map 0:v:0-map 用于指定输出文件使用的流,这里表示 "使用第 1 个输入文件(0)的第 1 个视频流(v:0)"。
    • -map 1:a:0 :表示 "使用第 2 个输入文件(1)的第 1 个音频流(a:0)"。
    • output_new_audio.mp4 :输出文件,包含 input.mp4 的视频和 output_audio.mp3 的音频。

任务 18: 调整音频音量

目的: 学习 volume 音频滤镜。
  • 命令 (音量加倍) : ffmpeg -i input.mp4 -af "volume=2.0" output_louder.mp4

  • 命令 (音量减半) : ffmpeg -i input.mp4 -af "volume=0.5" output_quieter.mp4

    • volume 是音频音量调节滤镜。
    • 2.0 表示将音量放大到原始音量的 2 倍(1.0 为原始音量,0.5 为减半,数值越大音量越大)。
任务 19: 混合两个音轨 (背景音乐)
  • 目的: 学习 amerge 和 pan 滤镜,为视频添加背景音乐。
  • 命令 :
    ffmpeg -i input.mp4 -i background_music.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map 0:v -map "[a]" -c:v copy -ac 2 output_with_bgm.mp4
    (这条命令将视频的原声和背景音乐合并成一个立体声音轨)
    • -i input.mp4 :第一个输入文件(索引为0),提供原始视频和音频。
    • -i background_music.mp3 :第二个输入文件(索引为1),提供背景音乐音频。
    • -filter_complex "[0:a][1:a]amerge=inputs=2[a]"
      • -filter_complex 用于处理多个流的复杂滤镜(此处处理两个音频流的合并)。
      • [0:a] 表示第一个输入文件的音频流,[1:a] 表示第二个输入文件的音频流。
      • amerge=inputs=2 是音频合并滤镜,inputs=2 表示合并 2 个音频流。
      • [a] 是合并后音频流的临时标签,用于后续映射输出。
    • -map 0:v:指定输出文件使用第一个输入文件的视频流(保留原视频画面)。
    • -map "[a]" :指定输出文件使用前面合并后的音频流 [a](原音频 + 背景音乐)。
    • -c:v copy:视频流直接复制(不重新编码,保留原始画质)。
    • -ac 2:设置输出音频为双声道(立体声,避免合并后可能出现的多声道问题)。
bash 复制代码
ffmpeg -i test.flv -i test_03.wav -filter_complex "[0:a][1:a]amerge=inputs=2,ac=2[a]" -map 0:v -map "[a]" -c:v copy -c:a libmp3lame -q:a 44 test_whit_wav.flv
任务 20: 音频变速
  • 目的: 学习 atempo 滤镜,用于处理音频速度。
  • 命令 (音频1.5倍速) :
    ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.66*PTS[v];[0:a]atempo=1.5[a]" -map "[v]" -map "[a]" output_av_fast.mp4
    (这里我们同时处理了视频和音频,让它们保持同步)

流媒体与高级操作 (10 个任务)

任务 21: 将视频转为图片序列
  • 目的: 将视频的每一帧都保存为一张图片。
  • 命令 : ffmpeg -i input.mp4 -vf fps=1 thumb%04d.jpg
    (fps=1 表示每秒抽一帧, %04d 会生成 thumb0001.jpg, thumb0002.jpg...)
任务 22: 图片序列合成为视频
  • 目的: 将一堆有序的图片合成为视频。
  • 命令: ffmpeg -framerate 25 -i thumb%04d.jpg -c:v libx264 -pix_fmt yuv420p output_from_images.mp4
任务 23: 为视频添加图片水印 (画中画)
  • 目的: 学习 overlay 滤镜。
  • 命令 (在左上角 10,10 的位置添加 logo.png) :
    ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" -c:a copy output_logo_overlay.mp4
任务 24: 视频去抖动
  • 目的: 学习 deshake 滤镜,修复手持拍摄的抖动画面。
  • 命令: ffmpeg -i shaky_video.mp4 -vf deshake output_stable.mp4
任务 25: 视频降噪
  • 目的: 学习 hqdn3d 滤镜,去除视频中的噪点。
  • 命令: ffmpeg -i noisy_video.mp4 -vf hqdn3d output_denoised.mp4
任务 26: 强制设置视频帧率
  • 目的: 学习 -r 参数。
  • 命令 (将视频帧率强制改为 25 fps): ffmpeg -i input.mp4 -r 25 -c:a copy output_25fps.mp4
任务 27: 制作 HLS 切片
  • 目的: 亲手制作 HLS 直播/点播所需的 .m3u8 和 .ts 文件。

  • 命令:

    复制代码
    mkdir hls
    ffmpeg -i input.mp4 -c:a aac -c:v libx264 -hls_time 10 -hls_list_size 0 -hls_segment_filename "hls/file%03d.ts" hls/playlist.m3u8

    (-hls_time 10 表示每个切片10秒, -hls_list_size 0 表示保留所有切片)

任务 28: 录制桌面
  • 目的: 学习如何从设备输入(而不只是文件)。
  • 命令 (Linux, 使用 x11grab): ffmpeg -f x11grab -video_size 1920x1080 -i :0.0 -c:v libx264 -preset ultrafast output_desktop.mkv
  • 命令 (Windows, 使用 gdigrab): ffmpeg -f gdigrab -i desktop -c:v libx264 -preset ultrafast output_desktop.mkv
任务 29: 模拟推流到 RTMP 服务器
  • 目的: 练习 -re 参数,模拟真实推流。
  • 命令 : ffmpeg -re -i input.mp4 -c copy -f flv rtmp://your_rtmp_server/live/stream
    (-re 参数会以视频的原始帧率读取文件,否则 FFmpeg 会以最快速度把文件读完并推送)
任务 30: 查看实时码率和调试信息
  • 目的: 学习如何获取 FFmpeg 的实时处理信息。

  • 命令 : 在任何一个转码命令后面加上 -progress - 或 -v debug 参数,观察终端输出的详细信息。

    ffmpeg -i input.mp4 -b:v 1M output.mp4 -progress progress.txt

    • -progress progress.txt:指定将转码进度信息输出到

      复制代码
      progress.txt

      文件中,包含以下内容:

      • 已处理时间(out_time
      • 比特率(bitrate
      • 帧率(fps
      • 完成百分比(progress=continue 表示正在处理,progress=end 表示完成)
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习