【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍

文章目录

  • 一、ffmpeg
    • 1.1 安装
    • 1.2 基本参数
  • 二、ffprobe
    • 2.1 查编码格式
    • 2.2 查视频时长
  • 五、视频转流
    • 5.1 MP4转H264
    • 5.2 H264转MP4
    • 5.3 AVI转MP4
    • 5.4 MP4转H265
  • 六、视频文件
    • 6.1 播放
    • 6.2 filter 过滤器
      • 6.2.1 crop
    • 6.3 视频截取
    • 6.4 视频拼接
    • 6.5 获取分辨率
  • 七、视频和图
    • 7.1 视频抽帧
    • 7.2 视频加图片水印
    • 7.3 生成 gif
    • 7.4 视频帧预览
  • 八、视频和音频
    • 8.1 音量

ffmpeg中文文档
常见测试视频
ffmpeg 大神笔记

一、ffmpeg

ffmpeg -h
ffmpeg -h long
ffmpeg -h full #可重定向到文件查看
ffmpeg -h full | grep h264 # 按关键字grep
ffmpeg -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol

1.1 安装

ffmpeg 的 release 是 Linux Static Build ,即静态库(各库已被打包到可执行程序中),而不是动态链接库(共享机器上的 so),所以非常方便部署(sqlite 也是这样),这是ffmpeg官网下载地址

1.2 基本参数

-threads 并行线程数(如ffmpeg -threads 4 -i input.mp4 output.mp4)

二、ffprobe

2.1 查编码格式

ffprobe a.mp4 -show_streams -select_streams v -print_format json | jq{ "streams": [ { "index": 0, "codec_name": "h264", "codec_long_name": "H.264/AVC/MPEG-4 AVC/MPEG-4 part 10", "profile": "Main", "codec_type": "video"}]
}

2.2 查视频时长

# 容器时长 container duration (和播放软件看到的时长一样)
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i input.mp4 # 输出单位是秒# 音视频流时长 stream duration
ffprobe -v error -select_streams v:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 input.mp4# 容器时长和音视频流时长略有差异
# 一个媒体文件里边有多个音视频流,各个流的时长也未必一样,一般播放器会以video stream的时长作为播放时长
# 另外,并不是所有格式的视频,会在音视频流级别保存了时长,这时可能会拿不到时长# 解码后的文件播放时长(get duration by decoding), 是最准确的, 但因需解码所以耗时较长
ffmpeg -i input.mp4 -f null - | grep time # 输出形如time=00:02:02.33

五、视频转流

rtsp-simple-server用法

ffmpeg -i a.mp4 -an -c h264 a_h264.mp4
ffplay 可播放本地文件
windows 下的格式工厂可修复视频文件格式

5.1 MP4转H264

ffmpeg -i input.mp4 -vcodec copy -bf 0 -an -bsf: h264_mp4toannexb -f h264 input.h264 # mp4转h264
# -vcodec copy 使用原视频的编码
# -bf 0 移除b帧
# -an 移除音频
# -bsf bitstream_filters  A comma-separated list of bitstream filters。其中 h264_mp4toannexb 是mp4解封装时必须加的参数(PS: 而封装为mp4时不需要加)
# -f h264 指定格式

注意,该命令会找时间点附近的 i 帧,所以如果视频本身有 i 帧丢失的话(警告如下),截取的视频会比期望的长:

按时间截取H264,且各段以i帧开头

ffmpeg -i input.h264 -ss 0:05 -to 0:40 -c:v copy -c:a copy a.h264

查看首帧是否为i帧

ffprobe -v quiet -show_frames -select_streams v a.h264 | grep pict_type

将各小h264拼接为大h264

# 写程序实现,读各h264到内存,内存拼接,写文件
# 或者用 ffmpeg
echo "file '1.h264'\nfile '2.h264'" > videos.txt
ffmpeg -y -safe 0 -f concat -i videos.txt -c copy o.h264 # -y 无需交互式确认, -c copy指定不需重新编码, -safe 0 指定不检查各文件名称(防止报错无意义的Unsafe file name)

5.2 H264转MP4

ffmpeg -f h264 -i a.h264 -vcodec copy output.mp4

如果报错Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly则无需理会,因为 ffmpeg 的这个警告不久以后将会被移除。参考

5.3 AVI转MP4

ffmpeg -i 4k-01.avi -c:v h264 4k-01.mp4

5.4 MP4转H265

如果原始视频就是 H265,则我们通过 -v copy 沿用其视频编码格式,防止非常耗时的编解码,所以我们希望把 H265 编码的 MP4 直接转为 H265 裸流。

ffmpeg -i a.mp4 -vcodec copy -bf 0 -an -bsf: hevc_mp4toannexb -f hevc input.h265
# -bsf: hevc_mp4toannexb: 从mp4拷贝到annexB封装

六、视频文件

6.1 播放

ffplay -rtsp_transport tcp rtsp://192.168.2.99/mystream

6.2 filter 过滤器

# 每个 filter 的各参数用冒号分隔。各 filter 之间用逗号分隔。形如下例: 
-vf "scale=256:256,transpose=1"

6.2.1 crop

ffmpeg -i a.mp4 -c:v libx264 -vf crop="400:400:100:100" output.mp4 # crop="w:h:x:y" 从视频的x,y处截取w和h的画面。-c:v libx264 是以 h264 重新编码视频

在这里插入图片描述

ffmpeg -i a.mp4 -c:v libx264 -vf "crop=iw/3:ih/3" o.mp4 # iw指input width, 设置为了原视频的三分之一。ih 同理

在这里插入图片描述

6.3 视频截取

ffmpeg -i input.mp4 -ss 1:05 -t 10 output.mp4 
# -ss(即position) 5指定从输入视频第1:05秒开始截取,-t(即duration) 10指明最多截取10秒
# -ss在-i后则会精确定位到1:05秒开始,而且会播放到第1:05后才执行使得更慢运行完
# -t可使用秒数(如-t 10),也可用-t 02:00:10ffmpeg -ss 1:05 -i input.mp4 -t 10 -c:v copy -c:a copy output.mp4
# 把-ss 1:05放到-i前面则会在第1:05附近的i帧开始,而且会直接找到1:05秒使得更快运行完
# -c:v 和 -c:a分别指定视频和音频的编码格式。
# -c:v copy -c:a copy标示视频与音频的编码不发生改变,而是直接复制,这样会大大提升速度。

6.4 视频拼接

echo "file '1.mp4'\nfile '2.mp4'" > videos.txt
ffmpeg -f concat -i videos.txt -c copy o.mp4 # -c copy指定不需重新编码

6.5 获取分辨率

ffmpeg -hide_banner -rtsp_transport tcp -i rtsp://192.168.2.99/a 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' #正则的{m,n}指: 最少匹配 n 次且最多匹配 m 次# 可能的流分辨率如下:
1920*1080 或 1920 * 1088, 即200w(即1080P)
2560 * 2048, 即400w(即2K), 即2倍1080P的算力
3072 * 2048, 即3倍1080P的算力
3840 * 2160, 即800w(即4K), 即4倍1080P的算力
4096 * 2160, 即5倍1080P的算力

七、视频和图

7.1 视频抽帧

ffmpeg -i a.mp4 -vf "fps=1/10,scale=-2:720" thumbnail-03%d.jpg
# -vf 指定过滤器(filter)
# fps设置输出帧率为十分之一,即每十秒输出一帧
# scale设置输出文件的大小,-2 即 width 自动计算出匹配的偶数, 720 即 指定的 heightffmpeg -i 666051400.mp4 -r 1 -q:v 2 ./%08d.jpg # 指定帧率1

7.2 视频加图片水印

ffmpeg -i a.mp4 -i lenna.png -filter_complex "overlay=100:100" output.mp4
# overlay=100:100 指定将 图放在视频的 100:100 像素的位置

在这里插入图片描述

7.3 生成 gif

注意:gif 自身格式限制了,视频不要太长

ffmpeg -i a.mp4 -ss 0 -t 5 -acodec copy -vcodec copy output.mp4 # 截取视频
ffmpeg -i output.mp4 -s 640x480 -f gif output.gif # -s指定图片分辨率

7.4 视频帧预览

# 预览首帧
ffmpeg -rtsp_transport tcp -i rtsp://192.168.2.99:3355/mystream -frames:v 1 -q:v 1 -y a.jpg

八、视频和音频

8.1 音量

ffmpeg -i a.mp4 -an o.mp4 # 删除音频轨(-vn 删除视频轨、-sn 删除字幕、-db 删除数据流)
ffmpeg -i a.mp4 -af "volume=1.5" o.mp4 # 设置音量大小为 1.5 倍(亲测 99.0 倍也可生效)
ffmpeg -i a.mp4 -af "loudnorm=I=-5:LRA=1" o.mp4 # 统一视频音量
ffmpeg -i a.mp4 -af "equalizer=f=1000:width_type=h:width=200:g=-1" o.mp4 # 添加equalizer(均衡器)

参考

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

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

相关文章

R语言中fread怎么使用?

R语言中 fread 怎么用? 今天分享的笔记内容是数据读取神器fread,速度嘎嘎快。在R语言中,fread函数是data.table包中的一个功能强大的数据读取函数,可以用于快速读取大型数据文件,它比基本的read.table和read.csv函数更…

【LeetCode】《LeetCode 101》第十三章:链表

文章目录 13.1 数据结构介绍13.2 链表的基本操作206. 反转链表(简单)21. 合并两个有序链表(简单)24.两两交换链表中的节点(中等) 13.3 其它链表技巧160. 相交链表(简单)234. 回文链表…

基于Pytorch的CNN手写数字识别

作为深度学习小白,我想把自己学习的过程记录下来,作为实践部分,我会写一个通用框架,并会不断完善这个框架,作为自己的入门学习。因此略过环境搭建和基础知识的步骤,直接从代码实战开始。 一.下载数据集并加…

【算法与数据结构】--高级算法和数据结构--高级数据结构

一、堆和优先队列 堆(Heap)是一种特殊的树状数据结构,通常用于实现优先队列。堆有两种主要类型:最大堆和最小堆。最大堆是一棵树,其中每个父节点的值都大于或等于其子节点的值,而最小堆是一棵树&#xff0…

关于使用 vxe-table 时设置了 show-overflow tooltip 不展示的问题(Dialog 组件和 table 同时使用)

众所周知,vxe-table 是可以支撑万级数据渲染的表格组件,本质上还是用了虚拟滚动的实现。之前一直知道vxe-table, 但是基本没有机会用的上这个组件,最近在开发埋点数据的统计,后端一次性返回了上千条数据,elementui 的 …

【JavaEE】Java的多线程编程基础知识 -- 多线程篇(2)

Java多线程编程基础知识 一、多线程的创建二、Thread类常用的方法和API2.1 Thread 的几个常见的属性2.2 start 启动一个线程2.3 终止一个线程2.4 等待一个线程-join()2.5 线程休眠函数 -sleep() 三、线程状态3.1 观察所有线程的状态3.2 线程状态和线程转移的意义 四、线程安全&…

Docker(六)、Docker-compose简单了解

Docker-compose简单了解 一、简单了解-->概述一)、官方提供的容器编排工具:Docker-compose特点:二)、Docker-compose安装三)、浅实践下四).以上步骤遇到问题及解决 一、简单了解–>概述 Docker-comp…

Redis设计与实现笔记 - 数据结构篇

Redis设计与实现笔记 - 数据结构篇 相信在我们日常使用中,会经常跟 Redis 打交道。数据结构 String、Hash、List、Set 和 ZSet 都是常用的数据类型。对于使用场景,我们可以滔滔不绝地说很多,但是我们从来就没有关心过它们的底层实现&#xf…

【软考-中级】系统集成项目管理工程师-人力资源管理历年案例

持续更新。。。。。。。。。。。。。。。 目录 2019 下 试题三(20分)背诵整理1. 冲突管理的6种方法2. 获取项目人力资源的依据 系列文章 2019 下 试题三(20分) 阅读下列说明,回答问题 1至问题 3,将解答填入答题纸的对应栏内     某公司承接了一个软件…

力扣第37题 解数独 c++ 难~ 回溯

题目 37. 解数独 困难 相关标签 数组 哈希表 回溯 矩阵 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫…

ThingsBoard的数据分析-自定义节点来订阅kafka stream的消息

1、概述 在ThingsBoard官方文档中有说明:ThingsBoard 规则引擎支持对传入遥测数据的基本分析,例如阈值交叉。规则引擎背后的想法是提供基于设备属性或数据本身将数据从物联网设备路由到不同插件的功能。 然而,大多数现实生活中的用例也需要高级分析的支持:机器学习、预测分…

Java RestTemplate使用TLS1.0(关闭SSL验证)

1. 问题 使用RestTemplate调用Http API时,服务器是TLS1.0,但是客户端Java默认禁止TLS1.0,会报错:org.springframework.web.client.ResourceAccessException: I/O error on POST request for “https://10.255.200.114/health”: …

介绍一下标准的 CSS 的盒子模型?低版本 IE 的盒子模型有什么不同的?

目录 解析: 标准的CSS盒子模型 盒子模型示例 DEMO: 低版本IE的盒子模型: 总结 解析: 标准的CSS盒子模型(Standard CSS Box Model)是Web开发中的一个基本概念,用于描述HTML元素在页面上的布局和相互关系。CSS盒子模型定义了每…

小谈设计模式(29)—访问者模式

小谈设计模式(29)—访问者模式 专栏介绍专栏地址专栏介绍 访问者模式角色分析访问者被访问者 优缺点分析优点将数据结构与算法分离增加新的操作很容易增加新的数据结构很困难4 缺点增加新的数据结构比较困难增加新的操作会导致访问者类的数量增加34 总结…

解决Github Markdown图片显示残缺的问题

title: 解决Github Markdown图片显示残缺的问题 tags: 个人成长 categories:杂谈 在Github存放Markdown文档,如果图片没有存放在Github服务器上,github会尝试生成Github图片缓存,使用Github图片缓存,进行实际的展示。但比较蛋疼的…

2023年中国火焰切割机分类、产业链及市场规模分析[图]

火焰切割机是一种工业设备,用于利用高温火焰对金属材料进行切割和切割加工的过程。这种技术通常在金属切割、切割、焊接和熔化等领域中使用,通过将氧气和燃料混合产生的火焰来加热金属至高温,然后通过氧化反应将金属氧化物吹散,从…

嵌入式mqtt总线架构方案mosquitto+paho

一 mqtt通信模型 MQTT 协议提供一对多的消息发布&#xff0c;可以降低应用程序的耦合性&#xff0c;用户只需要编写极少量的应用代码就能完成一对多的消息发布与订阅&#xff0c;该协议是基于<客户端-服务器>模型&#xff0c;在协议中主要有三种身份&#xff1a;发布者&…

推荐一种更高效的打字输入法——双拼输入法

简介 双拼&#xff08;也称双打&#xff09;是一种建立在拼音输入法基础之上的文字输入方法&#xff0c;可视为全拼的一种改进。它通过将每个汉字拼音的声母和韵母各自映射到某个按键上&#xff0c;使得每个汉字最多用两个按键表示&#xff0c;从而极大地提高了拼音输入法的输…

leetcode:105从前序与中序遍历序列构造二叉树

105&#xff1a;从前序与中序遍历序列构造二叉树 啊&#xff0c;好久都没有更新算法题目了。曾今是C&#xff0c;如今是Java&#xff0c;感慨啊。 像树这样的算法题&#xff0c;基本都逃不开递归。递归的思想是&#xff1a;将大任务拆分为小任务。我们不妨构建一个函数&#…

LLM ReAct: 将推理和行为相结合的通用范式 学习记录

LLM ReAct 什么是ReAct? LLM ReAct 是一种将推理和行为相结合的通用范式,可以让大型语言模型(LLM)根据逻辑推理(Reason),构建完整系列行动(Act),从而达成期望目标。LLM ReAct 可以应用于多种语言和决策任务,例如问答、事实验证、交互式决策等,提高了 LLM 的效率、…