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 接口


相关文章
|
7月前
|
编解码 数据安全/隐私保护 内存技术
ffmpeg笔记(三)ffmpeg指令总结
ffmpeg笔记(三)ffmpeg指令总结
|
7月前
|
编解码 网络协议 API
ffmpeg命令行工具源码之结构体分析1-命令行参数(未完结,持续更新)
ffmpeg作为多媒体文件转换工具,至少需要有一个要转换的输入文件信息(不仅仅是普通文件,还可以是摄像头设备,网络流等),和通常至少需要一个输出格式的文件(输出文件不仅仅指普通的文件,网络协议比如RTP协议,RTSP协议都可以理解为输出文件),ffmpeg的文件的转换过程主要由以下几个流程 (1)解封装 (2)解码 (3)过滤器 (4)编码 (5)封装 因此ffmpeg工具涉及的结构体主要就从这几个方面来说明这些结构体的含义。
84 0
|
编解码 Java Maven
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令
547 0
【Android FFMPEG 开发】Android 中执行 FFMPEG 指令
|
2月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
212 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
2月前
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
85 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
2月前
|
XML 开发工具 Android开发
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
ExoPlayer最初是为了解决Android早期MediaPlayer控件对网络视频兼容性差的问题而推出的。现在,Android官方已将其升级并纳入Jetpack的Media3库,使其成为音视频操作的统一引擎。新版ExoPlayer支持多种协议,解决了设备和系统碎片化问题,可在整个Android生态中一致运行。通过修改`build.gradle`文件、布局文件及Activity代码,并添加必要的权限,即可集成并使用ExoPlayer进行网络视频播放。具体步骤包括引入依赖库、配置播放界面、编写播放逻辑以及添加互联网访问权限。
185 1
FFmpeg开发笔记(五十六)使用Media3的Exoplayer播放网络视频
|
2月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
85 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
3月前
|
XML Java Android开发
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
GSYVideoPlayer是一款国产移动端视频播放器,支持弹幕、滤镜、广告等功能,采用IJKPlayer、Media3(EXOPlayer)、MediaPlayer及AliPlayer多种内核。截至2024年8月,其GitHub星标数达2万。集成时需使用新版Android Studio,并按特定步骤配置依赖与权限。提供了NormalGSYVideoPlayer、GSYADVideoPlayer及ListGSYVideoPlayer三种控件,支持HLS、RTMP等多种直播链接。
122 18
FFmpeg开发笔记(五十二)移动端的国产视频播放器GSYVideoPlayer
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
EasyPusher是一款国产RTSP直播录制推流客户端工具,支持Windows、Linux、Android及iOS等系统。尽管其GitHub仓库(安卓版:https://github.com/EasyDarwin/EasyPusher-Android)已多年未更新,但通过一系列改造,如升级SDK版本、迁移到AndroidX、指定本地NDK版本及更新Gradle版本等,仍可在最新Android Studio上运行。以下是针对Android Studio Dolphin版本的具体改造步骤。
70 3
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher