FFMPEG常用指令整理(未完结)

简介: ffmpeg是通用的媒体转换器,可以将广泛的输入(包括实时的抓取和记录设备)-过滤和转换为我们想要的输出格式文件。

介绍

ffmpeg命令行的工具格式如下:

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

ffmpeg是通用的媒体转换器,可以将广泛的输入(包括实时的抓取和记录设备)-过滤和转换为我们想要的输出格式文件。

ffmpeg可以读取任意数量的输入文件(包括普通文件,管道pipe,网络流,抓取设备等等),使用指定的-i参数,可以写到任意数量的输出文件,输出文件由纯url指定,在命令行上找到的任何不能被解释为选项的内容都被视为输出url。

原则上,每个输入或输出url可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流的数量和/或类型可能受到容器格式的限制。从哪些流中选择哪些输入将进入哪个输出是自动完成的,或者使用-map选项(请参考ffmpeg文档Stream specifiers 章节)。

要在选项中引用输入文件,必须使用它们的索引(从索引0开始)。例如,第一个输入文件是0,第二个是1,等等。类似地,文件内的流通过它们的索引来引用。例如,2:3是指第三个输入文件中的第四个流。详情可以参考文档Stream specifiers 章节。

作为一般规则,选项将应用于下一个指定的文件。因此,顺序很重要,您可以多次在命令行中使用相同的选项。然后,每次出现都会应用到下一个输入或输出文件。此规则的例外是全局选项(例如日志级别),应首先指定。

视频类指令

读取摄像头

1.查看本机摄像头名称(windows)

ffprobe -list_devices true -f dshow -i dummy

2.播放摄像头数据(windows)

ffplay -f dshow -i video="Integrated Webcam" //其中Integrated Webcam为第一步查询出的摄像头名称

3.将摄像头数据保存为mp4文件(windows)

ffmpeg -f dshow -i video="Integrated Webcam" -vcodec libx264 output.mp4

格式转换

1.从mp4文件中获取h264流

首先说下 MP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略。笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题。

(一)首先,从原理上了解一下这2种格式的区别:

AVC1 描述:H.264 bitstream without start codes.一般通过ffmpeg转码生成的视频,是不带起始码0×00000001的。

H264 描述:H.264 bitstream with start codes.一般对于一下HDVD等电影的压制格式,是带有起始码0×00000001的。

ffprobe -i test.mp4

使用上述命令可以查看test.mp4文件的属性:

Stream #0:0[0x1](und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(progressive), 1000x562 [SAR 1:1 DAR 500:281], 935 kb/s, 24 fps, 24 tbr, 12288 tbn (default)

可以看出我们的测试文件是AVC1格式的,也就是不含有开始码的

ffmpeg -i test.mp4 -an -vcodec copy -bsf:v h264_mp4toannexb test.h264

然后使用命令查看test.h264的属性:

Stream #0:0: Video: h264 (Main), yuv420p(progressive), 1000x562 [SAR 1:1 DAR 500:281], 24 fps, 24 tbr, 1200k tbn

可以看出文件是h264格式的,使用16进制查看文件也是具有开始码的,然后就可以使用ffplay或者vlc进行播放.


推流和拉流

1.rtp协议推流

首先, rtp每次推送只能推一路流, 如果用ffmpeg推送普通的影片,比如, mp4, 起码有视频流以及音频流,请在ffmpeg命令里面指定要推送的是视频还是音频, 否则会出现错误。


1.1推送流

推送普通视频 ffmpeg -re -i test.mp4 -metadata title="sdp test" -vcodec copy -an -f rtp rtp://192.168.101.8:11111 -vn -acodec copy -f rtp rtp://192.168.101.8:11113>v.sdp

推送摄像头视频 ffmpeg -f dshow -i video="Integrated Webcam" -b:v 500k -r 30 -g 30 -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -f rtp rtp://127.0.0.1:30010 > v.sdp

部分参数说明

-re:源文件固有帧率发送数据
-vcodec:设置视频编码/译码器
-acodec:设置音频编码/译码器 
copy:copy是ffmpeg的快速编辑的秘诀,表示仅复制,不重新编码和解码,接在-vcodec和-acodec后面。 
-f fmt 强迫采用格式fmt
-an:disable audio
-vn:disable video
最后将播放的信息存放到命令行文件的v.sdp文件下,播放器就可以根据这个sdp进行播放。

1.2接收视频流

ffplay -protocol_whitelist "file,udp,rtp" -i v.sdp

1.3 指定rtp的输出格式

如果不指定输出格式,rtp默认以mpeg4的格式进行输出,有时候我们想指定某个格式(比如为了调试ffmpeg代码或者接收视频流只能接收某个编码的类型),比如我们指定为mjpeg格式输出,因为我自己也在实现一个rtsp协议,需要支持mjpeg格式的支持,那么可以使用以下命令进行指定,如果想指定其他格式,比如h264等,也是类似的,不过需要对rtp协议传输指定的编码比较熟悉。

ffmpeg -i test.h264 -c:v mjpeg -huffman 0 -f rtp rtp://127.0.0.1:30010>v.sdp

上述 -huffman 0 强制mjpeg的rtp传输使用标准的huffman表,需要对mjpeg标准(itu-t81)和mjpeg的rtp传输标准(rfc2435)比较熟悉才能明白为啥要使用标准的huffman表,代码请参考

ffmepg 的 ff_rtp_send_jpeg 接口


相关文章
|
3月前
|
编解码 数据安全/隐私保护 内存技术
ffmpeg笔记(三)ffmpeg指令总结
ffmpeg笔记(三)ffmpeg指令总结
|
3月前
|
编解码 网络协议 API
ffmpeg命令行工具源码之结构体分析1-命令行参数(未完结,持续更新)
ffmpeg作为多媒体文件转换工具,至少需要有一个要转换的输入文件信息(不仅仅是普通文件,还可以是摄像头设备,网络流等),和通常至少需要一个输出格式的文件(输出文件不仅仅指普通的文件,网络协议比如RTP协议,RTSP协议都可以理解为输出文件),ffmpeg的文件的转换过程主要由以下几个流程 (1)解封装 (2)解码 (3)过滤器 (4)编码 (5)封装 因此ffmpeg工具涉及的结构体主要就从这几个方面来说明这些结构体的含义。
59 0
|
编解码 Java Maven
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令
497 0
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令
|
2月前
|
编解码
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
《FFmpeg开发实战》书中3.4.3节讲解如何将H.264流封装成MP4。H.264流通常以SPS→PPS→IDR帧开始,这一说法通过雷霄骅的H264分析器得到验证。分析器能解析H.264文件但不支持MP4。ZLMediaKit服务器在遇到I帧时会自动插入SPS和PPS配置帧,确保流符合标准格式。若缺少这些帧,客户端拉流时会报错。FFmpeg开发实战:从零基础到短视频上线》书中提供了更多FFmpeg开发细节。
56 0
FFmpeg开发笔记(三十三)分析ZLMediaKit对H.264流的插帧操作
|
1天前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
9 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
2天前
|
Web App开发 Android开发
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
实时数据传输在互联网中至关重要,不仅支持即时通讯如QQ、微信的文字与图片传输,还包括音视频通信。一对一通信常采用WebRTC技术,如《Android Studio开发实战》中的App集成示例;而一对多的在线直播则需部署独立的流媒体服务器,使用如SRT等协议。SRT因其优越的直播质量正逐渐成为主流。本文档概述了SRT协议的使用,包括通过OBS Studio和SRT Streamer进行SRT直播推流的方法,并展示了推流与拉流的成功实例。更多细节参见《FFmpeg开发实战》一书。
9 1
FFmpeg开发笔记(四十六)利用SRT协议构建手机APP的直播Demo
|
9天前
|
Web App开发 5G Linux
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
一年一度的毕业季来临,计算机专业的毕业设计尤为重要,不仅关乎学业评价还积累实战经验。选择紧跟5G技术趋势的音视频APP作为课题极具吸引力。这里推荐三类应用:一是融合WebRTC技术实现视频通话的即时通信APP;二是具备在线直播功能的短视频分享平台,涉及RTMP/SRT等直播技术;三是具有自定义动画特效及卡拉OK歌词字幕功能的视频剪辑工具。这些项目不仅技术含量高,也符合市场需求,是毕业设计的理想选择。
31 6
FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP
|
8天前
|
编解码 Java Android开发
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
​SRT Streamer是一个安卓手机端的开源SRT协议直播推流框架,可用于RTMP直播和SRT直播。SRT Streamer支持的视频编码包括H264、H265等等,支持的音频编码包括AAC、OPUS等等,可谓功能强大的APP直播框架。另一款APP直播框架RTMP Streamer支持RTMP直播和RTSP直播,不支持SRT协议的直播。而本文讲述的SRT Streamer支持RTMP直播和SRT直播,不支持RTSP协议的直播。有关RTMP Streamer的说明参见之前的文章《使用RTMP Streamer开启APP直播推流》,下面介绍如何使用SRT Streamer开启手机直播。
28 4
FFmpeg开发笔记(四十五)使用SRT Streamer开启APP直播推流
|
15天前
|
缓存 视频直播 Linux
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
《FFmpeg开发实战》书中介绍了轻量级流媒体服务器MediaMTX,适合测试但不适用于生产环境。SRS是一款国产开源服务器,支持RTMP、SRT等协议,适合生产使用。要启用SRS的SRT推流,需配置`srt.conf`,开启SRT服务并配置端口。在确保FFmpeg集成libsrt后,拉流则使用类似但带有`m=request`的地址。在Windows上,同样需要集成libsrt的FFmpeg来使用ffplay拉流。SRS的日志确认了推拉流的成功。书中提供更深入的FFmpeg开发知识。
46 2
FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务
|
22天前
|
视频直播 Windows
FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流
《FFmpeg开发实战》书中介绍了直播中的RTSP、RTMP和SRT协议,SRT提供更低延迟和稳定性。FFmpeg从4.0版起支持SRT,OBS Studio和MediaMTX等工具也已支持。在Windows环境下,通过集成libsrt的FFmpeg,可以建立SRT直播系统。MediaMTX日志显示SRT服务监听8890端口,OBS Studio设置SRT推流至"publish:live"。ffplay和VLC通过"read:live"拉流成功,验证了SRT推拉流功能。更多详情见《FFmpeg开发实战:从零基础到短视频上线》。
54 2
FFmpeg开发笔记(四十一)结合OBS与MediaMTX实现SRT直播推流