当前位置: 首页 > news >正文

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 等)。
"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

    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,音频与原文件一致。

    注意:滤镜有

    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.mp49.亮度 / 对比度 / 饱和度(eq)调整色彩参数(值范围:0-10,默认 1)。
    # 提高亮度(1.2倍),降低对比度(0.8倍)
    -vf "eq=brightness=0.2:contrast=0.8"10.灰度化(hue)将彩色视频转为黑白。
    -vf "hue=s=0"  # s=0 表示饱和度为011.锐化 / 模糊(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 滤镜链。

  • 命令:

    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):

    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:设置输出音频为双声道(立体声,避免合并后可能出现的多声道问题)。
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 表示完成)
http://www.xdnf.cn/news/1411903.html

相关文章:

  • 第 14 篇:K-Means与聚类思维——当AI在没有“标准答案”的世界里寻宝
  • 【C2000】C2000的硬件设计指导与几点意见
  • 开源知识抽取框架 推荐
  • 京东获取商品评论指南,实时关注用户反馈
  • 官方 API 与网络爬虫的技术特性对比及选型分析
  • Unity学习----【数据持久化】二进制存储(三)--文件夹操作
  • OpenStack 01:介绍
  • 暄桐林曦老师关于静坐常见问题的QA
  • 基于GA遗传优化的双向LSTM融合多头注意力(BiLSTM-MATT)时间序列预测算法matlab仿真
  • windows系统中的docker,xinference直接运行在容器目录和持载在宿主机目录中的区别
  • isat将标签转化为labelme格式后,labelme打不开的解决方案
  • MyBatis 黑马 辅助配置,数据库连接池
  • 柔性数组与不定长数据
  • 【秋招笔试】2025.08.31饿了么秋招笔试题
  • SPMTE 2022概述
  • 线程池常见面试问答
  • 一次解决 Elasticsearch 两大难题: 掌握去重和深分页的最佳实践
  • Day19_【机器学习—线性回归 (1)】
  • PerfectSquares.java
  • c++程序员日常超实用工具(长期记录更新)
  • 疯狂星期四文案网第56天运营日记
  • 创意无界:云渲染如何让视觉创作触手可及
  • python如何下载svg图片
  • 【LeetCode - 每日1题】解数独
  • 虚幻引擎技术开放日!facecar分享3D HMI设计与UE开发经验
  • 基于单片机智能电子秤/称重计费
  • Idea启动错误-java.lang.OutOfMemoryError:内存不足错误。
  • DBeaverEE Mac 数据库管理工具
  • 决胜千里之外:服务器及硬件项目标书制作全流程与避坑指南
  • 《SVA断言系统学习之路》【02】并发断言