简介

  • ffmpeg 常用命令和常用技巧

ffmpeg 多张图片编码成h264视频

你可以使用FFmpeg将多张图片编码成H.264视频。以下是一个示例命令:

1
ffmpeg -framerate 24 -i image%d.jpg -c:v libx264 -preset slow -crf 20 output.mp4

这个命令的解释如下:

  • -framerate 24:指定视频的帧率为24帧每秒。你可以根据需要调整这个值。
  • -i image%d.jpg:指定输入图片的路径和格式。%d会被替换为数字序列,比如image1.jpg、image2.jpg等。
  • -c:v libx264:指定视频编码器为libx264,即H.264编码器。
  • -preset slow:指定编码速度为慢速,可以提高视频质量。
  • -crf 20:设置视频的质量。CRF值越低,视频质量越高,范围一般在18-28之间。你可以根据需要调整这个值。
  • output.mp4:指定输出视频的文件名和格式。

你可以根据需要修改参数来满足你的具体需求。

从指定时间截取指定长度视频

  • 命令:
    • ffmpeg -ss 00:00:00 -t 00:00:14 -i zhuoer_face.mkv -vcodec copy -acodec copy aaa.mp4
  • 参数
    • -ss : 开始截取的时间点
    • -t : 要截取视频的时间长度
    • -i : 输入的视频文件
    • -vcodec copy : 拷贝原视频,不更改格式
    • -acodec copy : 拷贝原音频,不更改格式
    • aaa.mp4 : 输出视频文件

合并视频文件

  • 命令:
    • ffmpeg -f concat -i list.txt -c copy zhuoer_face_new.mp4
  • list.txt
    1
    2
    3
    
      file aaa.mp4
      file bbb.mp4
      file ccc.mp4
    
  • 参数:
    • -f concat :
    • -i list.txt : 输入配置文件
    • -c copy : 拷贝原视频,不更改格式
    • zhuoer_face_new.mp4 : 输出视频文件

ffmpeg保存摄像头视频到本地

  • ffmpeg -rtsp_transport tcp -i rtsp://admin:a1234567@192.167.0.56:554 -c copy -f mp4 -t 00:10:00 /data/output.mp4

ffmpeg缩放视频(等比例)

  • ffmpeg -i input-video.mp4 -vf scale=300:180 ./output.mp4
  • 参数:
    • -vf – filter_graph, set video filters

FFmpeg将视频按帧截取保存为图片

  • ffmpeg -i /home/user/Videos/new_year.mp4 -r 5 -f image2 image-%03d.jpg
  • 参数:
    • -i – 指定输入源
    • -r – 指定抽取的帧,即从视频中每秒抽取的图片数量
    • -f – fmt,强迫采用格式fmt 保存图片使用的格式
    • image-%03d.jpg – 指定文件的输出名字

获取音视频信息

  • ffprobe是FFmpeg项目提供的用于分析视频信息的命令工具
  • 例如:ffprobe -v quiet -print_format json -show_format -show_streams test.mp4可以活动json格式的输出的视频信息
    • -v quiet : 将日志级别设为quiet,避免日志信息污染json
    • -show_format : 显式文件的容器信息
    • -show_stream : 显式容器中流的信息
    • -show_frames : 则可以显式视频中每一帧的信息

使用ffmpeg进行视频处理

  • ffmpeg的命令格式:
    1
    2
    3
    4
    5
    
      ffmpeg \
          [global_options] \
          [input_file_options] -i input_url \
          [actions] \
          [output_file_options] output_url
    
  • 可以将ffmpeg的选项分为全局选项和局部选项
    • 局部选项用于设置输入输出或滤镜等,通常位于被修饰的指令前面
  • ffmpeg的基本流程为:将容器中的各流进行解码,然后重新编码为指定的格式。在编码之前,可以使用filter对视频进行处理

  • 选项
    • -y / -n : 全局选项,-y表示直接覆盖已经存在的输入文件,-n表示若某个输出文件已经存在则退出。若没有设置-y-n选项,且某个输出文件已经存在,ffmpeg会询问是否要覆盖输出文件
    • -codec , -c : 指定输入输出的编解码器,可用的编解码器参考官方文档
      • codec指定为copy则将输入流直接复制到输出流不进行编码操作
      • 使用-c:STREAM_INDEX方式可以指定某一个流的编码器,STREAM_INDEX为stream对象的index属性
      • -c:v, -vcodec,可以为所有视频流指定编解码器, -c:v:1为第2各视频流指定编解码器
      • -c:a, -acodec,可以为所有音频流指定编解码器, -c:a:12为第13个视频流指定编解码器
    • -ss : 用于设置流的开始视频,可以设置输入输出或滤镜,在开始时间之前的帧将被跳过部处理(输入不被解码,输出不被编码,滤镜不被处理)
      • 秒数 : -t 10, -t 24.134
      • 时分秒 : -t 10:23, -t 21:31:00.233
    • -t : 选项用于设置输入输出,它在-i前可以限制输入时长,在输入文件前可限制输出时长
    • -to : 类似于-t选项,不同的是它指定结束时刻,-t指定持续时间
    • -f : 强制设置输入输出的文件格式,默认情况下ffmpeg会根据文件后缀名判断格式
      • ffmpeg-formats 命令会显示所有支持的编码格式
    • -vframes : 设置输出文件中包含的总帧数
    • -vn : 不将视频流写到输出文件中
    • -an : 不将音频流写到输出文件中
    • -r : 设置某个流的帧率
    • -s : 设置帧的大小
    • -threads : 设置处理线程数
    • -shortest : 当最短的输入流结束后,即停止编码和输出