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

这篇具有很好参考价值的文章主要介绍了【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

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 帧丢失的话(警告如下),截取的视频会比期望的长:
【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍,音视频流媒体,实时音视频

按时间截取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 重新编码视频

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

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

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

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:10

ffmpeg -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标示视频与音频的编码不发生改变,而是直接复制,这样会大大提升速度。

ffmpeg -ss 1:05 -i input.mp4 -t 10 -c:v copy -c:a aac output.mp4 # 指定音频为 aac 编码格式

6.3.1 案例:音频 pcm_alow 格式不对

【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍,音视频流媒体,实时音视频
输入的视频,时长为 01:09:08.08 秒

封装为 MP42,MP42 是一种封装格式,它通常用于存储视频和音频数据。它是基于 MPEG-4 Part 2 标准的一种格式,支持较高的压缩比和良好的视频质量。MP42 封装格式常用于存储和传输视频文件,它可以容纳不同编码格式的视频和音频数据,并提供了一种统一的方式来播放这些数据。

compatible_brand 是用于指定封装格式的兼容品牌(compatible brand)。这个选项可以在将媒体文件封装为特定格式时使用,它定义了所生成的封装文件与哪些品牌的解码器兼容。

compatible_brand 选项的值通常是一个四个字符的字符串,表示兼容的品牌。这些字符串可以是标准的品牌标识符,例如 “isom”(表示 ISO Base Media File Format),“mp42”(表示 MPEG-4 Part 14 封装格式)等。通过指定 compatible_brand,你可以确保所生成的封装文件可以被相应品牌的解码器所识别和解码。

所以 mp42isomHKMI 是海康的解码器。

Stream 0 是视频,用 hevc(即 h265)编码,yuv420p 颜色编码格式。像素为 2560 x 1440,比特率 1987 kb/s,码率 25 fps
Stream 1 是音频,用 pcm_alaw 编码,8000 Hz,1 通道,比特率 64 kb/s。

报错信息是:codec 编解码器暂不支持 pcm_alaw 音频格式。
解决方案:使用 aac 编码,如 ffmpeg -ss 1:05 -i input.mp4 -t 10 -c:v copy -c:a aac output.mp4。详见 https://stackoverflow.com/questions/47495713/could-not-find-tag-for-codec-pcm-alaw-in-stream-1-codec-not-currently-supporte

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 即 指定的 height

ffmpeg -i 666051400.mp4 -r 1 -q:v 2 ./%08d.jpg # 指定帧率1

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

7.2 视频加图片水印

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

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

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(均衡器)

参考文章来源地址https://www.toymoban.com/news/detail-716734.html

到了这里,关于【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 音视频流媒体开发难以学习?今天教你如何“丝滑”入门

    Android平台最常用的渲染工具就是鼎鼎大名的 OpenGL ,程序员多多少少都有听过它,目前市面上众多3A游戏引擎很多就是由OpenGL编写的,而与此同时,对咱们Android开发来说,为什么要学习Opengl呢?其实就俩字: 高薪 ! 今天就带大家来了解了解 OpenGL ! OpenGL到底是什么呢?很多人

    2023年04月08日
    浏览(8)
  • Qt/C++音视频开发51-推流到各种流媒体服务程序

    Qt/C++音视频开发51-推流到各种流媒体服务程序

    最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不仅同时支持rtsp/rtmp推流,

    2024年02月09日
    浏览(12)
  • JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并转码推流rtmp流媒体服务

    JavaCV音视频开发宝典:使用javacv读取GB28181、海康大华平台和网络摄像头sdk回调视频码流并转码推流rtmp流媒体服务

    《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 本篇文章用于解决javacv接入h264/hevc裸流或者接入ps/ts流等字节流的非流媒体协议视频源接入并推流到rtmp流媒体服务。 本篇文章适用于gb28181/海康大华网络摄像机设备sdk对接以及海康大华等视频平

    2023年04月09日
    浏览(23)
  • 音视频 ffplay命令播放媒体

    播放本地文件 播放网络流 强制解码器 禁用音频或视频 播放YUV数据 播放RGB数据 播放PCM数据 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核) https://xxetb.xet.tech/s/VsFMs

    2024年02月10日
    浏览(21)
  • 音视频开发:ffplay使用ffmpeg滤镜实现倍速播放

    曾经为实现倍速播放使用过ffmpeg,对音频使用atempo滤镜即可实现变速不变调。但是当时效果并不是特别好,和soundtouch相比处理后的音质有明显的区别。最近用新版本的ffmpeg滤镜重新实现了倍速播放,发现效果变好,已经达到可接受的程度,所以在此分享具体实现。 ffmpeg倍速

    2024年02月03日
    浏览(47)
  • 使用EasyDarwin + ffmpeg 搭建流媒体服务器,实现多台智能电视同步播放宣传视频

    使用EasyDarwin + ffmpeg 搭建流媒体服务器,实现多台智能电视同步播放宣传视频

    近期单位用户提出需求,需要在单位内部的9台安卓智能电视(小米电视)上同步播放用户提供的宣传视频,希望能够做到所有电视音视频同步播放(电视均位于食堂内部,使用内置扬声器,各电视间音频延迟不同会导致混响) 。 由于电视在安装时只预留了电源线,使用HDM

    2024年02月10日
    浏览(52)
  • 使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)

    使用nginx和ffmpeg搭建HTTP FLV流媒体服务器(摄像头RTSP视频流->RTMP->http-flv)

    名词解释   RTSP (Real-Time Streaming Protocol) 是一种网络协议,用于控制实时流媒体的传输。它是一种应用层协议,通常用于在客户端和流媒体服务器之间建立和控制媒体流的传输。RTSP允许客户端向服务器发送请求,如播放、暂停、停止、前进、后退等,以控制媒体流的播放和

    2024年02月16日
    浏览(14)
  • Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

    Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

    在这篇文章中,我将详述如何搭建一个RTMP(Real-Time Messaging Protocol)服务器,并使用ffmpeg技术进行本地视频的推流。最后,我们将使用VLC播放器来播放这个RTMP流。 首先,我们需要搭建一个RTMP服务器。为了方便起见,我们将选择Docker作为服务器的环境。Docker的轻量化和可移植

    2024年01月17日
    浏览(12)
  • FFmpeg流媒体处理的收流与推流

    FFmpeg流媒体处理的收流与推流

    1. 简介 流媒体是使用了流式传输的多媒体应用技术。如下是维基百科关于流媒体概念的定义: 流媒体 (streaming media) 是指将一连串的媒体数据压缩后,经过网络分段发送数据,在网络上即时传输影音以供观赏的一种技术与过程,此技术使得数据包得以像流水一样发送;如果不

    2024年02月11日
    浏览(15)
  • FFmpeg 的使用与Docker安装流媒体服务器

    FFmpeg 的使用与Docker安装流媒体服务器

    本文阐述的均为命令行的使用方式,并不牵扯FFmpeg 的 C++音视频开发内容,补充一句,C++的资料真的少,能把C++学好的人,我真的是觉得巨佬。 我主要是使用FFmpeg 推流方面的知识,案例大都是靠近这方面。 一、FFmpeg 介绍 本文读者会比较小众~ 看到此文的朋友,大概率是需要

    2024年01月17日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包