FFmpeg库之ffmpeg

文章目录

  • ffmpeg命令行使用
    • 基本命令
      • 选择流 -map选项
    • 主要命令
    • 视频选项
    • 音频选项
    • 多媒体格式转换
    • 滤镜
      • 裁剪
      • 加水印
      • 画中画
    • 录制
      • 查看可用的录制设备
      • 查看录制设备选项参数
      • 录制桌面
      • 录制窗口
      • 录制摄像头
      • 录制麦克风
      • 录制系统声音
      • 同时录制桌面和麦克风
    • 直播
      • 推流
      • 拉流

ffmpeg命令行使用

ffmpeg是一个通用的媒体转换器。它可以读取各种输入(包括实时抓取/录制设备),对其进行过滤,并将它们转码为多种输出格式。

语法格式:

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url}...

基本命令

命令名称作用
-version显示ffmpeg版本
-formats显示可用的格式
-demuxers显示可用的解复用器
-protocols显示可用的协议
-muxers显示可用的复用器
-filters显示可用的过滤器
-devices显示可用的设备
-pix_fmts显示可用的像素格式
-codecs显示所有的编解码器
-sample_fmts显示可用的采样格式
-decoders显示可用的解码器
-layouts显示声道名称
-encoders显示所有的编码器
-colors显示识别的颜色名称
-bsfs显示比特流filter

选择流 -map选项

-map选项用于手动控制每个输出文件中的流选择。用户可以跳过-map,让ffmpeg执行如下所述的自动流选择。-vn/-an/-sn/-dn选项可用于分别跳过包含视频、音频、字母和数据流。

使用格式如下:

-map 文件索引位置:流索引位置
-map 文件索引位置:流的类型
-map 文件索引位置:流的类型:流的索引位置

流类型:

  • a 表示音频流
  • v 表示视频流
  • s 表示字幕流
  • d 表示数据流
  • t 表示附件六
    注意:索引位置从0开始

在特定输出文件没有任何映射选项的情况下,ffmpeg检查输出格式以检查哪种类型的流可以包含在其中,即视频,音频或字母。对于每个可接受的流类型,ffmpeg将从所有输入中选择一个可用的流。
它将根据以下标准选择该流:

  • 对于视频来说,它是分辨率最高的流媒体
  • 对于音频,它是具有最多通道的流
  • 对于字母,这是找到的第一个字幕流,但有一个警告,输出的格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只会选择相同类型的字幕流
  • 在相同类型的多个流速率相等的情况下,选择索引最低的流
    注意:数据或附件流不会自动选择,只能使用-map包含

例如:假设有如下几个视频文件

input file 'A.avi'stream 0: video 640x360stream 1: audio 2 channelsinput file 'B.mp4'stream 0: video 1920x1080stream 1: audio 2 channelsstream 2: subtitles (text)stream 3: audio 5.1 channelsstream 4: subtitles (text)input file 'C.mkv'stream 0: video 1280x720stream 1: audio 2 channelsstream 2: subtitles (image)

执行如下命令
ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

指定了3个输出文件,对于前2个,没有设置-map选项,因此ffmpeg将自动为这两个文件选择流(会选择最好的那个流)。
out1.mkv是一个Matroska容器文件,它接受视频、音频和字幕流,因此ffmpeg将尝试在每种类型中选择一种。
对于视频,它将从B.mp4中选择流0,它所在所有输入视频流中具有最高的分辨率。
对于音频,它将从B.mp4中选择流3,因为它有最多的通道。
对于字幕,它将从B.mp4中选择流2,这是A.avi和B.mp4之间的第一个字幕流。
out2.wav只接受音频流,所以只选择B.mp4的流3。
out3.Mov,由于设置了-map选项,因此不会发生自动流选择。-map 1:a选项将选择来自第二个输入B.mp4的所有音频流。此输出文件中不会包含其他流。
对于前两个输出,所有包含的流都将被转码。所选择的编码器将是每个输出格式注册的默认编码器,它可能与所选输入流的编码器不匹配。
对于第三个速出,音频流的编解码器选项已经设置为复制,因此不会发生或可能发生解码-过滤-编码操作。所选流的数据包应从输入文件传送,并在输出文件中进行混合。

主要命令

命令名称作用
-f fmt (input/output)强制输入或输出文件格式。通常会自动检测输入文件的格式,并从输出文件的文件扩展名中猜测格式,因此在大多数情况下不需要此选项
-i url (input)输入文件的URL
-stream_loop number (input)设置输入流循环的次数。循环0表示没有循环,循环-1表示无限循环
-t duration (input/output)当用作输入选项(在-i之前)时,限制从输入文件读取数据的持续时间。当用作输出选项(在url之前)时,在其持续时间达到duration后停止写入输出。duration必须是时间持续时间规格,请参阅ffmpeg-utils(1)手册中的时间持续时间部分。
-to position (input/output)在该位置停止写入输出或读取输出-to和-t是互斥的,-t具有优先级
-ss positon (input/output)当用作输入选项(在-i前)时,在此输入文件中查找位置。当用作输出选项(在url前)时,解码但丢弃输入,直到时间戳到达指定位置
-c[:stream_specifier] codec (input/output,per-stream)为一个或多个流选择编码器(在输出文件前使用)或解码器(在输入文件前使用)。

实例:

  1. 从视频中分离音频
    在这里插入图片描述
    执行完后生成了aac文件
    在这里插入图片描述
    2.把上述音频改成mp3,并限制到3秒结束
    在这里插入图片描述

视频选项

命令名称作用
-vframes number (output)设置输出的视频帧数。
-r[:stream_specifier] fps (input/output,per-stream)设置帧速率
-s[:stream_specifier] size (input/output,per-stream)设置分辨率
-vcodec codec(output)设置视频编解码器
-pix_fmt[:stream_specifier] format (input/output,per-stream)设置像素格式

音频选项

命令名称作用
-aframes number (output)设置输出的音频帧数
-ar[:stream_specifier] freq (input/output,per-stream)设置音频采样率
-ac[:stream_specifier] channels (input/output,per-stream)设置音频通道的数量
-acodec codec (input/output)设置音频编解码器
-sample_fmt[:stream_specifier] sample_fmt (input/output,per-stream)设置音频样本格式

多媒体格式转换

命令名称作用
ffmpeg -i 输入文件路径 输出文件路径容器格式转换
ffmpeg -i 输入文件路径 -c:v copy -an 输出文件路径提取视频流
ffmpeg -i 输入文件路径1 -i 输入文件路径2 … -map 文件索引1:v -c:v copy -map 文件索引2:v -c:v copy … 输出文件路径提取多个视频流到一个文件中
ffmpeg -i 输入文件路径 -c:a copy -vn 输出文件路径提取音频流
ffmpeg -i 输入文件路径 -c:v 视频编码器名称 输出文件路径视频转码
ffmpeg -i 输出文件路径 -c:v 视频编码器名称 -an 输出文件路径抽取视频流转码
ffmpeg -i 输入文件路径 -c:a 音频编码器名称 输出文件路径音频转码
ffmpeg -i 输入文件路径 -an -c:v rawvideo -s 分辨率 -pix_fmt 像素格式 out.yuv抽取视频文件的视频原始数据
ffmpeg -s 原始图像分辨率 -pix_fmt 原始图像格式 -i 输入文件路径 -s 目标图像分辨率 -pix_fmt 目标图像格式 输出文件路径YUV和RGB互相转换
ffmpeg -i 输入文件路径 -vn -ar 采样率 -ac 声道数 -c:a 编码器名称 输出文件路径抽取视频文件中原始音频数据
ffmpeg -i 输入文件路径 -s 分辨率 输出文件路径修改视频分辨率
ffmpeg -i 输入文件路径 -b:a 码率 输出文件路径修改音频码率
ffmpeg -i 输入文件路径 -ar 采样率 输出文件路径修改音频采样率
ffmpeg -ss 00:00:10 -i 输入文件路径 -t 时长 输出文件路径从第10秒截取视频,视频时长是后面指定的时长
ffmpeg -i 输入文件路径 输出文件路径(.ts)视频转ts流
ffmpeg -f concat -i 文件列表.txt 输出文件路径视频拼接。文件列表.txt格式如下: file ‘video-30fps.MP4’ 一行一个路径
ffmpeg -i 输入文件路径 -y -f 图片格式 -vframes 帧数 输出文件路径(如果图片超过1张,需要使用%d)提取视频中的图片
ffmpeg -i 输入文件路径 输出文件路径图片转视频,例ffmpeg -i img%d.jpg out.mp4
ffmpeg -i 输入文件路径 -t 视频时长 -r 帧率 输出文件路径视频转GIF
ffmpeg -i 输入文件路径 -f 格式名称 输出文件路径GIF转视频

滤镜

简单过滤图是指只有一个输入和输出且类型相同的过滤图。它们可以通过在解码和编码之间插入一个额外的步骤来表示:

 _________                        ______________
|         |                      |              |
| decoded |                      | encoded data |
| frames  |\                   _ | packets      |
|_________| \                  /||______________|\   __________   /simple     _\||          | /  encoderfiltergraph   | filtered |/| frames   ||__________|

简单的过滤器图配置有每个流-筛选选项(与-vf和-af分别为视频和音频的别名)。一个简单的视频过滤图可以如下所示:

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______|      |_____________|      |_______|      |________|

请注意,某些过滤器会更改框架属性,但不会更改框架内容。例如, fps上例中的过滤器更改帧数,但不触及帧内容。另一个例子是setpts过滤器,它只设置时间戳,否则不改变地传递帧。

复杂的过滤器图不能简单地描述为应用于一个流的线性处理链。例如,当图具有多个输入和/或输出时,或者当输出流类型与输入不同时,就会出现这种情况。它们可以用下图表示:```

 _________
|         |
| input 0 |\                    __________
|_________| \                  |          |\   _________    /| output 0 |\ |         |  / |__________|_________     \| complex | /
|         |     |         |/
| input 1 |---->| filter  |\
|_________|     |         | \   __________/| graph   |  \ |          |/ |         |   \| output 1 |_________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|

复杂的过滤图配置为-filter_complex选项。请注意,此选项是全局的,因为复杂的过滤器图本质上不能与单个流或文件明确关联。

-lavfi选项相当于-filter_complex。

复杂过滤器图的一个简单示例是overlay过滤器,它具有两个视频输入和一个视频输出,其中一个视频叠加在另一个视频之上。它的音频对应部分是amix滤波器。

裁剪

-vf crop=ow[:oh[:x[:y[:keep_aspect]]]]
  • -vf:使用视频滤镜
  • ow:输出视频的宽度
  • oh:输出视频的高度
  • x:指定裁剪的位置x
  • y:指定裁剪的位置y
  • keep_aspect:是否保持纵横比

例如:指定从(100,200)位置,保持纵横比,裁剪大小为640x480

 ffmpeg -i .\video-30fps.MP4 -vf crop=640:480:100:200:0 裁剪.mp4

在这里插入图片描述

加水印

ffmpeg -i 输入文件路径 -vf drawtext:"fontsize=字体大小:fontfile=字体文件路径:text="水印内容":fontcolor=字体颜色:x=字体位置:y=字体位置" 输出文件路径#例如
ffmpeg -i .\裁剪.mp4 -vf drawtext="fontfile=SIMLI.TTF: text='你好,世界!':fontcolor=red:x=200:y=300:fontsize=50" 水印.mp4

在这里插入图片描述

画中画

ffmpeg -i 输入文件路径 -vf movie="画中画视频文件路径,scale=缩放大小[sub];[in][sub]overlay=x=位置:y=位置[out]" 输出文件位置
#例如
ffmpeg -i .\video-60fps.MP4 -vf movie="水印.mp4, scale=320x240[sub];[in][sub]overlay=x=100:y=150[out]" 画中画.mp4

在这里插入图片描述

录制

windows需要安装dshow软件,才能录制系统声音。以下命令只针对windows

查看可用的录制设备

ffmpeg -list_devices true -f dshow -i dummy

查看录制设备选项参数

ffmpeg -f dshow -list_options true -i 类型="设备名称"
#例如
查看摄像头参数
ffmpeg -f dshow -list_options true -i video="USB Camera"
查看麦克风参数
ffmpeg -f dshow -list_options true -i audio="麦克风 (Realtek(R) Audio)"
查看桌面录制参数
ffmpeg -f gdigrab -list_options true -i desktop

录制桌面

录制整个桌面
ffmpeg -f gdigrab -i desktop -pix_fmt 图像格式 输出路径
#例如
ffmpeg -f gdigrab -i desktop 桌面录制.mp4录制指定区域
ffmpeg -r 帧率 -f gdigrab -s 分辨率 -offset_x 宽度偏移量 -offset_y 高度偏移量 -i desktop -vcodec 编码器名称 文件路径
#例如
ffmpeg -f gdigrab -i desktop -s 800x600 -offset_x 100 -offset_y 200  桌面录制2.mp4

录制窗口

ffmpeg -f gdigrab -i title="窗口名称" 输出路径

由于大多数程序隐藏了原来的边框,录制出来经常是黑屏

录制摄像头

ffmpeg -f dshow -i video="摄像设备名称" 输出路径#例如
ffmpeg -f dshow -i video="USB Camera" 摄像头录制.mp4

录制麦克风

ffmpeg -f dshow -i audio="麦克风 (Realtek(R) Audio)" 麦克风录制.mp3

录制系统声音

ffmpeg -f dshow -i audio="立体声混音 (Realtek(R) Audio)" 麦克风录制2.mp3
# audio=的是声卡设备名称

同时录制桌面和麦克风

ffmpeg -f gdigrab -i desktop -f dshow -i audio="麦克风 (Realtek(R) Audio)" 桌面加麦克风.mp4

直播

推流

直播推流需要先开启服务器

ffmpeg -re -i 输入文件路径 -c copy -f flv rtmp地址
#例如
ffmpeg -re -i video.mp4 -c copy -f flv rtmp://127.0.0.1:1935/live/room
#然后用ffplay观看直播

拉流

ffmpeg -i rtmp地址 -c copy 输出文件路径
#例如 
ffmpeg -i rtmp://ns8.indexforce.com/home/mystream -c copy 拉流.flv
#播放拉到的内容
ffplay .\拉流.flv -x 800 -y 600

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客周赛 Round 72 题解

本次牛客最后一个线段树之前我也没碰到过&#xff0c;等后续复习到线段树再把那个题当例题发出来 小红的01串&#xff08;一&#xff09; 思路&#xff1a;正常模拟&#xff0c;从前往后遍历一遍去统计即可 #include<bits/stdc.h> using namespace std; #define int lo…

SKETCHPAD——允许语言模型生成中间草图,在几何、函数、图算法和游戏策略等所有数学任务中持续提高基础模型的性能

概述 论文地址&#xff1a;https://arxiv.org/pdf/2406.09403 素描是一种应用广泛的有效工具&#xff0c;包括产生创意和解决问题。由于素描能直接传达无法用语言表达的视觉和空间信息&#xff0c;因此从古代岩画到现代建筑图纸&#xff0c;素描在世界各地被用于各种用途。儿童…

SpringBoot整合druid数据源

SprintBoot默认使用的是HikariDataSource数据源&#xff0c;而且上次课中我们也说了这个数据源访问速度很快&#xff0c;但是这里还要给大家介绍一个第三方的数据源druid&#xff0c;它是阿里开发的一款开源的数据源&#xff0c;被很多人认为是Java语言中最好的数据库连接池&am…

Dubbo 3.x源码(26)—Dubbo服务引用源码(9)应用级服务发现订阅refreshServiceDiscoveryInvoker

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了MigrationRuleHandler这个处理器&#xff0c;它用于通过动态更改规则来控制迁移行为。MigrationRuleListener的onrefer方法是Dubbo2.x 接口级服务发现与Dubbo3.x应用级服务发现之间迁移的关键…

Qt Creator 为同一个项目切换不同的构建套件(Kit)

如下图所示&#xff0c;我只有一个构建套件&#xff1a; 切换构建套件(Kit)的步骤如下&#xff1a; 选中上图中的步骤②后&#xff0c;可以看到如下图所示的结果&#xff0c;构建套件就已经添加成功了&#xff1a; 此时&#xff0c;我们可以自由选择使用哪一个构建套件。 如…

vue3实现商城系统详情页(前端实现)

目录 写在前面 预览 实现 图片部分 详情部分 代码 源码地址 总结 写在前面 笔者不是上一个月毕业了么&#xff1f;找工作没找到&#xff0c;准备在家躺平两个月。正好整理一下当时的毕业设计&#xff0c;是一个商城系统。还是写篇文章记录下吧 预览 商品图片切换显示…

Java深拷贝和浅拷贝区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java深拷贝和浅拷贝区别?】面试题。希望对大家有帮助&#xff1b; Java深拷贝和浅拷贝区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&am…

React 第十七节 useMemo用法详解

概述 useMemo 是React 中的一个HOOK&#xff0c;用于根据依赖在每次渲染时候缓存计算结果&#xff1b; 大白话就是&#xff0c;只有依赖项发生变化时候&#xff0c;才会重新渲染为新计算的值&#xff0c;否则就还是取原来的值&#xff0c;有点类似 vue 中的 computed 计算属性…

全国数据资源入表年度发展报告(2024)(附下载)

近日&#xff0c;在“数据要素暨第二届数据资产价值大会”上&#xff0c;青岛、潍坊、湖州、广西等地的数据资产登记评价中心&#xff0c;联合发布了《全国数据资源入表年度发展报告&#xff08;2024&#xff09;》。 报告内容包括全国数据资源入表的总体发展概述、政策指引、…

【Mybatis】MyBatis 探秘:#{} 与 ${} 参传差异解码,数据库连接池筑牢数据交互根基

前言 &#x1f31f;&#x1f31f;本期讲解关于Spring IOC&DI的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么…

解锁 draw.io 流程图制作工具的强大功能与应用(1/2)

一、draw.io 简介 &#xff08;一&#xff09;基本概述 draw.io 是一款由 JGraph 公司开发的基于网页的在线图表绘制工具。它最大的优势之一就是无需进行繁琐的下载和安装步骤&#xff0c;只要打开浏览器&#xff0c;访问其官网&#xff0c;就能立即开始使用。无论是在 Window…

ai论文写作免费平台:五款AI论文写作辅助工具的对比与分析

随着人工智能技术的飞速发展&#xff0c;越来越多的AI工具应运而生&#xff0c;为学术写作带来了前所未有的便利。本文将对千笔AI论文、笔灵AI论文、Smodin、以及Notion AI等五款AI论文写作辅助工具进行全面的对比与分析&#xff0c;以帮助用户更好地了解这些工具的优势和特点&…

三、基于langchain使用Qwen搭建金融RAG问答机器人--检索增强生成

经过前面2节数据准备后&#xff0c;现在来构建检索 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingFaceEmbeddings import os# 定义 Embeddings embeddings HuggingFaceEmbeddings(model_name"m3e-base")#…

数据仓库工具箱—读书笔记02(Kimball维度建模技术概述02、事实表技术基础)

Kimball维度建模技术概述 记录一下读《数据仓库工具箱》时的思考&#xff0c;摘录一些书中关于维度建模比较重要的思想与大家分享&#x1f923;&#x1f923;&#x1f923; 第二章前言部分作者提到&#xff1a;技术的介绍应该通过涵盖各种行业的熟悉的用例展开&#xff08;赞同…

fabric.js

目录 一、在canvas上画简单的图形 二、在canvas上用路径(Path)画不规则图形 三、在canvas上插入图片并设置旋转属性(angle) 四、让元素动起来(animate) 五、图像过滤器(filters)让图片多姿多彩 六、颜色模式(Color)和相互转换(toRgb、toHex) 七、对图形的渐变填充(Gradi…

Liinux下VMware Workstation Pro的安装,建议安装最新版本17.61

建议安装最新版本17.61&#xff0c;否则可能有兼容性问题 下载VMware Workstation安装软件 从官网网站下载 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 选择所需版本 现在最新版本是17.61&#xff0c;否则可能有兼容性问题…

压力测试Jmeter简介

前提条件&#xff1a;要安装JDK 若不需要了解&#xff0c;请直接定位到左侧目录的安装环节。 1.引言 在现代软件开发中&#xff0c;性能和稳定性是衡量系统质量的重要指标。为了确保应用程序在高负载情况下仍能正常运行&#xff0c;压力测试变得尤为重要。Apache JMeter 是一…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

LSTM详解

1. LSTM设计 LSTM(长短期记忆网络)详解 长短期记忆网络(LSTM, Long Short-Term Memory) 是一种特殊的循环神经网络(RNN),特别适合处理和预测序列数据中的长时间依赖关系。LSTM 通过引入“门机制”(如输入门、遗忘门、输出门)来解决标准 RNN 在长时间序列任务中梯度消…

我在广州学 Mysql 系列之 数据类型和运算符详解

ℹ️大家好&#xff0c;我是&#x1f606;练小杰&#xff0c;今天主要学习 Mysql的数据类型以及运算符操作~~ 上周五学习了“Mysql 系列之 数据“表”的基本操作”~ 想要了解更多&#x1f236;️MYSQL 数据库的命令行总结&#xff01;&#xff01;&#xff01; “我是你的敌人,…