ffmpeg、ffplay、ffprobe命令的使用

1. ffmpeg、ffplay、ffprobe命令使用

⭐ffmpeg命令

多用于转码,从url/现场 音频/视频源抓取输入源

主要参数:

  • -i 指定输入流
  • -f 指定输出格式
  • -ss xx:xx:xx 指定从什么时间开始转换
  • -t xx:xx:xx 指定输出文件的时长
  • -y 覆盖已有文件
  • -fs limit_size 设置文件大小上限

关于视频的参数

  • -bv: 640K 设定视频码率为640k
  • -minratee 600k 设定视频码率最小阈值为700k
  • -maxrate 700k 设定视频码率最大阈值为700k
  • -r 60 设定视频帧率fps=60
  • -s 720x352 设定画面的宽与高为720X352
  • -aspect 16:9 设定画面的比例为16:9
  • -vn 不处理视频(比如只提取音频的时候)
  • -vcodec 设定视频编解码器,(比如-vcodec codec,表示使用输入流的格式, -vcodec xvid表示使用XVID编码压缩视频)

音频参数:

  • -ar 22500 设定采样率(audio rate)为22.5khz
  • -b:a 640k 设定音频码率为640k
  • -ac 2 设定声音的Channel数为2
  • -acodec 设定声音编解码器(比如-acodec codec,表示使用输入流的格式, -acodec aac表示使用aac编解码)
  • -an 不处理音频

举例说明:

  • 视频转码:ffmpeg -i .\test.mp4 output.ts

    问题:失真严重,默认设置通常注重兼容性性能,而非高质量输出。

    image-20241225141450329

    通过设置参数转码:ffmpeg -i .\test.mp4 -c:v libx264 -crf 18 -preset slow output.ts

    • -c:v libx264:指定使用 H.264 编码器。

      -crf(Constant Rate Factor)

      • 控制视频质量,范围是 0-51,值越小质量越高。
      • 推荐值:18(接近无损质量),22(中等质量)
      • -preset
        • 控制编码速度和压缩效率的平衡。
        • 常见值:ultrafast(最快)到 veryslow(最慢但质量最佳)。

      image-20241225141929303

  • 提取原始数据/文件

    (原始数据无法通过ffplay播放)

    • 提取原始音频数据:ffmpeg -i test.mp4 -f s16le out.pcm(s16le表示(signed 16 bits little endian, 有符号 16 位小端))
    • 提取yuv420p数据:ffmpeg -i test.mp4 -pix_fmt yuv420p out.yuv
    • 提取出音频文件:ffmpeg -i test.mp4 -vn music.aac
    • 删除视频的音频流:ffmpeg -i test.mp4 -vcodec copy -an output.mp4
  • 添加水印:ffmpeg -i test.mp4 -i logo.png -filter_complex overlay output.mp4

    -filter_complex 是 FFmpeg 中用于应用复杂过滤器图(filtergraph)的选项。允许你同时应用多个滤镜,或者处理多个输入和输出流。

    ​ 这个选项通常用于处理更复杂的场景,比如多个视频流的拼接、合并、特效应用等。

  • 去除水印:ffmpeg.exe -i output.mp4 -vf "delogo=x=0:y=0:w=200:h=100:show=1" test1.mp4尝试去除失败

  • 保存视频帧:ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 img/pic-%03d.jpeg

ffplay命令

FFplay是一个非常简单和可移植的媒体播放器,使用FFmpeg库和SDL库。它主要用作各种FFmpeg API的测试平台

最简单的播放命令:ffplay input.avi

常用快捷键:

  • q,ESC : 退出。
  • f : 切换全屏。
  • P,空格键 : 停下来。
  • m : 切换静音。
  • a : 在当前程序中循环音频通道。
  • v : 循环视频频道。
  • t : 当前程序中的循环字幕通道。
  • c : 循环程序。
  • w:循环视频过滤器或显示模式。
  • s : 进入下一帧
  • left/right : 寻找向后/向前10秒。
  • down/up : 向后/前进1分钟。
  • page down/page up : 寻找上一视频/下一视频。或者,如果没有,请向后/向前寻求10分钟。

ffprobe命令

ffprobe用来查看多媒体文件的信息

常用命令:ffprobe -show_packets input.mp4

也可通过:ffprobe -v error -show_entries stream=width,height -of csv=p=0 input.mp4查看基本信息

# 视频包
[PACKET]
codec_type=video
stream_index=0
pts=170000
pts_time=5.666667
dts=170000
dts_time=5.666667
duration=1000
duration_time=0.033333
convergence_duration=N/A
convergence_duration_time=N/A
size=2018
pos=1541272
flags=__
[/PACKET]
# 音频包
[PACKET]
codec_type=audio
stream_index=1
pts=260096
pts_time=5.418667
dts=260096
dts_time=5.418667
duration=1024
duration_time=0.021333
convergence_duration=N/A
convergence_duration_time=N/A
size=466
pos=1543290
flags=K_
[/PACKET]

ffprobe 将音视频数据分解成多个 PACKET 是因为音视频文件的本质是由一系列的 数据包(packet) 组成,这些数据包按照时间顺序存储音视频流的具体内容。

  • codec_type : 帧类型,如视频包video、音频包audio等
  • stream_index : 多媒体的stream索引(上图的stream0表示video数据,steam1表示audio数据)
  • ★pts(Presentation Time Stamp) : 显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据
  • ★dts(Decoding Time Stamp) : 解码时间戳,表示在什么时候解码的这一帧数据。
  • duration : 数据包的持续时间,表示这个数据包覆盖的时间范围。(需要持续多久切换下一帧)
  • size : 数据包该帧的字节大小
  • pos : 该帧所在的文件偏移位置
  • flags : 该帧标记,如关键帧K_与非关键帧__的标记

posted on 2024-12-25 15:01  say-Hai  阅读(1879)  评论(0)    收藏  举报

导航