百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

nanshan 2024-11-23 20:16 21 浏览 0 评论

本文阐述的均为命令行的使用方式。

一、FFmpeg 介绍

本文读者会比较小众~ 看到此文的朋友,大概率是需要用到FFmpeg啦,简单说一下下。

就算是从来没接触过的朋友,其实也已经在生活的各个方面都接触过FFmpeg处理完东西(音视频)。

一句话来总结:FFmpeg 就是一款封装好的关于音视频方面的开源处理工具。

它功能强大,用途广泛,大量用于视频网站和商业软件(比如 Youtube 和 iTunes),也是许多音频和视频格式的标准编码/解码实现。

如果有接触过 gstreamer (另外一个音视频处理框架),它的也有使用到 FFmpeg 的编码器。

二、FFmpeg 安装

sudo apt-get install ffmpeg

版本查看

ffmpeg --help

安装就一会的事情,主要还是要看怎么使用。

三、FFmpeg 使用

FFmpeg 的命令行参数分布大致如下:

领C++音视频开发资料→「链接」

ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]

下面是一个例子。

ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
output.avi # 输出文件

上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。

如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子。

ffmpeg -i input.avi output.mp4

四、FFmpeg 常见案例

本章节只是简单的介绍了如何使用,并且解释啦常用的参数,如果需要更详细全面的参数解释,可以查看FFmpeg官方文档。

封包格式(format、视频格式)、编码、解码、帧率、I帧、B帧等等一些偏向于专业的名词,大伙如果有需求可以去仔细了解了解,我这边暂时只是简单使用一下。

4.1、转换编码格式

转换编码格式(transcoding)指的是, 将视频文件从一种编码转成另一种编码。比如转成 H.264 编码,一般使用编码器libx264,所以只需指定输出文件的视频编码器即可。

ffmpeg -i 1.mp4 -c:v libx264 output_h264.mp4

查看支持的编码器(也就是 -vcodec 简称为 -c:v 后面可以接的参数):

ffmpeg -codecs

支持很多很多,不一一列举出来啦

4.2、转换文件格式:

ffmpeg -y -i 1.mp4 -c:v libx264 -preset ultrafast -b:v 6000k output_avi.avi 其中,

:v 代表视频,:a 代表音频;

  • -i 1.mp4 表示视频输入来源,这表示当前目录下的 1.mp4 ,也可以接收来自外部视频源或者本机摄像头作为视频来源
  • -c:v libx264 表示使用264编码器,
  • -preset,H.264 的转码预设参数和调优参数。指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
  • -b 6000k 指定码率(比特率),码率低时速度快,但失真严重,码率高时反之;
  • -y 表示如果已存在 output_avi.avi则将其覆盖;

4.3、对已有视频进行抓图:

ffmpeg -i output_avi.avi -y -f image2 -ss 8 -t 0.001 -s 1980x1280 'test.jpg'

4.4 调整码率

调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

ffmpeg -i 1.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output_rate.mp4

4.5 改变分辨率(transsizing)

下面是改变视频分辨率(transsizing)的例子,从 1080p 转为 480p 。

ffmpeg -y -i 1.mp4 -vf scale=480:-1 output_scale.mp4

4.6 提取音频

有时,需要从视频里面提取音频(demuxing),可以像下面这样写。

ffmpeg -y -i 1.mp4 -vn -c:a copy output_avideo.aac

上面例子中,-vn表示去掉视频,-c:a copy表示不改变音频编码,直接拷贝。

4.7、本地摄像头推流

ffmpeg -f video4linux2 -r 30 -i /dev/video0 -vcodec h264 -f flv rtmp://192.168.79.133:1935/live/stream0

稍微解释一下上面的命令:

  • -f video4linux2 -r 30 -i /dev/video0 表示从 /dev/video0 中以 30 fps 的帧率采集视频,视频格式 为 video4linux2
  • c:v libx264 输出视频的编码格式是 H.264, RTMP 通常采用H.264 编码
  • f flv 指的视频的封包格式, RTMP 一般采用 flv 封包格式。
  • an 忽略音频流
  • preset superfast -tune zerolatency H.264 的转码预设参数和调优参数。会影响视频质量和压缩率

注意:在虚拟机中使用摄像头需注意、将USB的兼容性设置成USB3.0 ,否则出现推流一直卡在那


五、Docker 安装流媒体服务器,推流和拉流实现

这里我当时就是随便在github上找了一个可以docker方式部署的流媒体服务器~

直接输入下面这条命令就可以构建成功啦。

sudo docker run -id --restart=always -p 1935:1935 -p 8080:80 -p 8443:443 -p 554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp zlmediakit/zlmediakit:master

FFmpeg 推流和拉流测试

推流和拉流,要是接触过视频服务可能就比较了解~

粗糙的流程就大致如上图啦,推流就是将收集到的视频流推送到流媒体服务器上去,拉流就是从流媒体服务器上把视频拉取下来,进行播放。

至于如何收集视频,如何进行视频处理,更为详细的就没有介绍啦,FFmpeg 是涵盖了全流程的, 可以去了解了解。

里面牵扯到的 RTSP、RTMP、HTTP-FLV协议,都是一些视频相关的协议,可以去了解了解,我这里只测试了 RTSP和RTMP协议。

领C++音视频开发资料→「链接」

rtsp 推流和拉流

ffmpeg -re -i 1.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.79.133/live/room

(rtsp 端口我这里使用的是默认的 554,故而省略没写啦

拉流进行播放可以使用专门的播放器,也可以使用ffmpeg的组件ffplay来进行视频的播放

ffplay 拉流进行播放

ffplay rtsp://192.168.79.133:554/live/room

常用的播放器 vlc media player 也可以播放 rtsp 和 rtmp 协议的视频流。

播放器截图

然后正常播放就是ok啦

rtmp 推流

ffmpeg -re -i 1.mp4 -vcodec h264 -acodec aac -f flv rtmp://192.168.79.133/live/room

ffplay rtmp://192.168.79.133:1935/live/room

rtmp协议的端口号是 1935 ~这些端口号,都是可以修改的,是否支持取决于你部署的流媒体服务器是什么样的。


播放器截图

(另外,这个流媒体服务器内部对视频做了处理,可以实现多种输出,你RTMP推上去的,也可以用RTSP协议拉流下来的)

相关推荐

在 Ubuntu 上安装 Zabbix(以 Zabbix 6.4 LTS 版本为例)

Zabbix是一个流行的开源监控解决方案,能够监控各种网络参数和服务器健康状态。一、环境准备系统要求Ubuntu20.04/22.04LTS至少2GBRAM(生产环境建议4GB+)至少1...

如何在 Ubuntu 24.04 服务器上安装 Apache Solr

ApacheSolr是一个免费、开源的搜索平台,广泛应用于实时索引。其强大的可扩展性和容错能力使其在高流量互联网场景下表现优异。Solr基于Java开发,提供了分布式索引、复制、负载均衡及自...

如何在 Ubuntu 24.04 LTS 或 22.04/20.04 上安装 Apache Maven

Maven是由Apache托管的开源工具,用于管理Java项目。它包含一个项目对象模型(POM):一个配置文件(XML),其中包含项目的基本信息,包括配置、项目依赖项等。Maven可以处理...

Cursor的终极对手——Trae Pro最新系统提示词

前段时间,字节的AI编程神器Trae国际版,终于甩出了Pro订阅计划!很多对它又爱又恨的小伙伴,直呼:终于等到你。爱它,是因为Trae长期免费+体验真香;恨它?还不是那该死的排队等待,...

AI系统提示词:V0(ai代码提示)

以下是对V0系统提示词(SystemPrompt)的分部分讲解与解读,帮助你理解其核心内容和设计意图。V0系统提示词##CoreIdentity-Youarev0,Vercel&...

8岁男童失踪第13天,搜救人员发现可疑水库,更恶心的事情发生了

Lookingatyourrequest,Ineedtorewritethearticleaboutthe8-year-oldmissingboywhilemaking...

docker常用指令及安装rabbitMQ(docker安装zabbix)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

三步教你用Elasticsearch+PyMuPDF实现PDF大文件秒搜!

面对100页以上的大型PDF文件时,阅读和搜索往往效率低下。传统关系型数据库在处理此类数据时容易遇到性能瓶颈,而Elasticsearch凭借其强大的全文检索和分布式架构,成为理想解决方案。通过...

ElasticSearch中文分词插件(IK)安装

坚持原创,共同进步!请关注我,后续分享更精彩!!!前言ElasticSearch默认的分词插件对中文支持很不友好。一段话按规则会以每个中文字符来拆解,再分别建立倒排索引。如"中华人民共和国国歌...

SpringBoot使用ElasticSearch做文档对象的持久化存储?

ElasticSearch是一个基于Lucene的开源搜索引擎,广泛应用于日志分析、全文搜索、复杂查询等领域,在有些场景中使用ElasticSearch进行文档对象的持久化存储是一个很不错的选择...

Elasticsearch数据迁移方案(elasticsearch copyto)

前言最近小编要去给客户部署一套系统涉及到了Mysql和ES数据的迁移,下面就给大家分享一下ES数据迁移的几套方案,根据具体的使用场景来选择不同的迁移方案能使你事倍功半,话多说下面就一一介绍。Elast...

Rancher部署单体ElasticSearch(rancher2.5部署)

Rancher是k8s图形管理界面,之前曾有写文章介绍如何安装。ElasticSearch是热门搜索引擎,很多地方都有用到,常规安装部署略显繁琐,本文介绍在k8s下用rancher简易部署ES。1.在...

Elasticsearch在Java项目的搜索实践:从零开始构建高效搜索系统

Elasticsearch在Java项目中的搜索实践:从零开始构建高效搜索系统在现代的Java项目中,数据量激增,传统的数据库查询方式已经无法满足快速检索的需求。这时,Elasticsearch(E...

小白入门-Kibana安装(kibana安装配置)

一Kibana基础1.1介绍Kibana是一款免费且开放的前端应用程序,其基础是ElasticStack,可以为Elasticsearch中索引的数据提供搜索和数据可视化功能。Kiban...

Docker上使用Elasticsearch,Logstash,Kibana

在对一个项目做性能测试时我需要处理我们web服务器的访问日志来分析当前用户的访问情况。因此,我想这是试用ELK的一个好机会。ELK栈首先要注意的是使用它是非常简单的。从决定使用ELK到在本机上搭一个...

取消回复欢迎 发表评论: