1. ffmpeg基础命令使用

前言

随着5G时代的来到,音视频行业也希望会有一波水涨船高,那我们就从基础开始走一遍音视频技术中的重点,首先我们学习的是ffmpeg,主要学习如何使用ffmpeg,比如命令,比如一些常用的api,最后我们会利用qt+ffmpeg 去做一个音视频播放器,后面有时间在基于qt实现一个视频监控系统。


一、ffmpeg是什么?

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。官网地址:https://ffmpeg.org/

二、常用命令介绍

1.分类

ffmpeg大体可以分为8类

  1. 基本查询命令
  2. 录制命令
  3. 分解/复用命令
  4. 处理原始数据命令
  5. 裁剪与合并命令
  6. 图片/视频互转命令
  7. 直播相关的命令
  8. 各种滤镜命令

2.ffmpeg处理流程

以下流程一定需要牢牢的刻在脑海中
在这里插入图片描述

输入文件就是mp4,flv。这些文件我们称之为具有封装格式的文件,你可以把它想象成一个盒子。盒子里的数据就是音视频数据。拿到盒子的第一步打开盒子就是demuxer,然后我们拿到的数据就是编码的数据包,因为他是有压缩的,并不是原始的数据,然后进行解码decoder,得到解码之后的数据帧(其实跟原始数据还是有差别的),然后比如拿到了720p的数据帧,但是需要改成480p的数据帧,就需要encoder,变成解码后的数据包,然后需要给别人看重新进行封装就是muxer,封装成一种播放器可以识别的格式,最后播放器解码播放,输出数据。

查询命令

参数 说明
-version 显示版本。
-formats 显示可用的格式(包括设备)。
-demuxers 显示可用的demuxers。
-muxers 显示可用的muxers。
-devices 显示可用的设备。
-codecs 显示libavcodec已知的所有编解码器。
-decoders 显示可用的解码器。
-encoders 显示所有可用的编码器。
-bsfs 显示可用的比特流filter。
-protocols 显示可用的协议。
-filters 显示可用的libavfilter过滤器。
-pix_fmts 显示可用的像素格式。
-sample_fmts 显示可用的采样格式。
-layouts 显示channel名称和标准channel布局。
-colors 显示识别的颜色名称。

录屏命令

首先通过下面的命令查看一下 mac 上都有哪些设备
ffmpeg -f avfoundation -list_devices true -i “”
参数解释:

-f avfoundation: 这个参数指定了输入设备的类型。在这里,avfoundation是指macOS平台上的一种捕获设备类型,用于捕获音频和视频。

-list_devices true: 这个参数告诉FFmpeg列出所有可用的捕获设备信息。在这种情况下,它会列出所有可用的音频和视频捕获设备。

-i "": 这是输入文件或输入设备的路径。在这里,双引号中间是空的,表示没有指定具体的输入设备,而是在列出设备时显示所有可用的设备。

所以,这个命令的目的是列出macOS平台上所有可用的音频和视频捕获设备。

ffmpeg -f avfoundation -i1 -r30 out.yuv

-i1: 这个参数后面应该跟着要捕获的设备的索引号。然而,在这个命令中,-i1这个参数是无效的,因为应该是-i后面跟着设备的索引号。可能是一个笔误或者误解。正确的应该是-i 1,这表示选择索引号为1的捕获设备。

-r30: 这个参数指定了输出视频的帧率为30帧/秒。 -r参数用于设置输出视频的帧率。

out.yuv: 这是指定输出文件的名称和格式。在这里,输出的视频将以YUV格式保存,并命名为out.yuv。

这个命令的目的是从索引号为1的avfoundation捕获设备捕获视频,并将其保存为YUV格式的文件,输出视频的帧率为30帧/秒。

分解与复用

简单的说就是文件格式的转换,比如将mov转换成MP4,各种各样多媒体文件之间的互转,或者单独处理文件中的音频或视频
在这里插入图片描述
抽取音频流命令:
ffmpeg -i input.mp4 -acodec copy -vn out.aac

  • acodec: 指定音频编码器,copy 指明只拷贝,不做编解码
  • vn: v 代表视频,n 代表 no 也就是无视频的意思

抽取视频流命令:
ffmpeg -i input.mp4 -vcodec copy -an out.h264

  • vcodec: 指定视频编码器,copy 指明只拷贝,不做编解码。
  • an: a 代表视频,n 代表 no 也就是无音频的意思

转格式命令:
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。

音视频合并命令:
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4
将一个 H.264 视频文件 (out.h264) 和一个 AAC 音频文件 (out.aac) 合并成一个 MP4 文件 (out.mp4)

处理原始数据命令

提取YUV命令:
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv
从输入的 MP4 视频文件 (input.mp4) 中提取视频流,并将其转换为未压缩的 YUV420 格式的视频文件 (out.yuv),同时忽略输入文件的音频流。

  • -i input.mp4:指定输入的 MP4 视频文件路径为 input.mp4
  • -an:表示不包含音频流,即忽略输入文件的音频流。
  • -c:v rawvideo:指定视频编码器为 rawvideo,即未压缩的视频格式。
  • -pixel_format yuv420p:指定像素格式为 YUV420,这是一种广泛用于视频编码的格式,其中 Y 表示亮度,U 和 V 表示色度。

滤镜命令

该命令的使用场景是处理视频的加水印,去水印,画中画等,所有的滤镜处理都是对解码之后的数据帧进行处理,

在这里插入图片描述

添加水印命令:
ffmpeg -i out.mp4 -vf “movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]” water.mp4

  • -i out.mp4:指定输入的视频文件路径为 out.mp4。
  • -vf “movie=logo.png,scale=64:48[watermask];[in] [watermask] overlay=30:10 [out]”:这是视频滤镜选项。-vf 表示应用视频滤镜。具体操作如下:
    movie=logo.png:加载水印图片 logo.png。
    scale=64:48:将水印图片调整为 64x48 的尺寸。
    [watermask]:将经过缩放的水印图片命名为 watermask。
    [in][watermask] overlay=30:10:将原始视频流与水印图片叠加在一起。overlay=30:10 表示在视频上的位置,其中 30 表示水平偏移量,10 表示垂直偏移量。
    [out]:将叠加后的视频命名为 out。
    water.mp4:指定输出的视频文件路径为 water.mp4。

视频裁剪与合并

裁剪命令:
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4

  • -ss 指定裁剪的开始时间,精确到秒
  • -t 被裁剪后的时长。

合并命令
首先需要创建一个写有多个文件名的txt,我们假设 inputs.txt 就是这个文件。然后在文件里写上以下格式的多个flv文件。
file ‘1.flv’
file ‘2.flv’
输入命令ffmpeg -f concat -i inputs.txt -c copy output.flv

  • -c copy: 这个参数指定了视频和音频的编解码方式。在这里,copy表示不对视频和音频进行重新编码,而是直接拷贝原始的编码数据。这样可以加快处理速度,避免降低视频质量。

视频图片互转

视频转JPEG文件命令
ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg

  • -i test.flv: 这个参数指定了输入文件的路径和名称。在这里,test.flv是要处理的输入FLV视频文件。

  • -r 1: 这个参数指定了输出图像序列的帧率。在这里,设置为1帧/秒,即每秒输出一张静态图像。

  • -f image2: 这个参数指定了输出图像的格式。在这里,image2表示输出为图像序列。

  • image-%3d.jpeg: 这是指定输出图像文件名的格式。%3d表示序列号的格式化,其中%3d表示序列号占据3位数,不足3位的序列号会在前面补0。.jpeg表示输出图像的格式为JPEG。

这个命令的目的是将输入的FLV视频文件test.flv转换为一系列的静态图像,并以image-001.jpeg,image-002.jpeg,… 的格式保存到当前目录中。每秒生成一张静态图像

直播相关

推流命令:ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName

  • -re: 这个参数告诉FFmpeg以正常速度读取输入文件。如果不加这个参数,FFmpeg会尽可能快地读取输入文件,这在实时流处理中可能会导致问题。

  • -i out.mp4: 这个参数指定了输入文件的路径和名称。在这里,out.mp4是要处理的输入MP4视频文件。

  • -c copy: 这个参数指定了视频和音频的编解码方式。在这里,copy表示不对视频和音频进行重新编码,而是直接拷贝原始的编码数据。这样可以加快处理速度,避免降低视频质量。

  • -f flv: 这个参数指定了输出的格式为FLV。在这里,输出将以FLV格式推流到RTMP服务器上。

  • rtmp://server/live/streamName: 这是RTMP服务器的地址以及推流的流名称。server是RTMP服务器的地址,live是RTMP服务器上的应用程序名称,streamName是要推流的流名称。

总结

提示:以上举了几个各个种类的一些基础命令,有很多参数这边也没全部拿出来举栗子。有任何使用疑问的都可以去官方文档查看下

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值