音视频领域强大的辅助工具-ffmpeg常用操作介绍


前端时间老是有人问我,有没有其他格式的视频或音频提供,愿意有偿获取,如果其对ffmpeg比较熟悉,就不会那么麻烦。经常从事流媒体领域开发和研究工作的人,ffmpeg应该是我们最常用到的流媒体工具,很多流媒体软件都直接集成了ffmpeg库或者工具程序,直接使用其协议接入、协议转换、流媒体封装、流媒体编解码等能力或者库实现对应的功能。本文主要介绍使用我们在流媒体开发调试过程中比较常用的ffmpeg命令,对其命令及使用场景进行介绍,如果后续用到,可直接查询本文相关内容。相关测试的音视频文件可相关测试的音视频文件关注公众号 ,发送 视频流分析来获取。

1 ffmpeg安装部署

不做详细介绍,进官网,选择操作系统,下载安装即可。官网地址如下:
https://ffmpeg.org/

也可下载源码,自己编译。

通过安装包安装后,相关执行路径会自动添加到系统环境变量里,不需要自己添加,可在cmd里直接运行:
ffmeg -version
如果返回版本信息,则说明安装成功。

2 ffmpeg命令格式介绍

命令格式:

ffmpeg -i [输入文件名/地址] [参数选项] -f [格式] [输出文件/地址]

参数解释:

  1. -i后为媒体流的输入,可以为文件,也可以是视频流地址
  2. [参数选项]定义流媒体转换的参数,详细定义了转换的方式
  3. -f 后为输出的媒体流格式,定义输出媒体流的输出格式
  4. 之后直接为输出媒体流到文件或者到推送地址

例如:ffmpeg -i test.h264 -vcodec copy -f mpegts test.ts
参数-i后为流媒体的输入,为H264裸流文件test.h264;参数选型为-vcodec copy 表示视频的编码格式为流媒体源的格式,即还是H264;-f mpegts表示输出的流媒体为ts;test.ts表示输出到的目标文件名。

ffmpeg中起到转换作用的[参数选项],其后可根据实际需要进行输出媒体流的输出方式、编码类型、媒体类型等进行配置,也是我们实现流媒体转码的参数配置的地方,这里介绍下常用的参数说明

  • -vcodec 视频编码类型,可以与输入保持一致(copy),也可以转码为其他格式,比如:

2 ffmpeg实现流媒体转码

我们经常看到网上分享很多离线或在线工具,对音视频文件类型进行转换,其基本上是使用了ffmpeg的库或者直接封装了ffmpeg的程序来实现的,因为ffmpeg支持的文件封装协议非常全、编解码库支持的音视频编码类型也非常的全,由于其基于C编写的,因此整个程序/库也非常的小巧、稳定且效率高,是此类开源软件中应用非常广泛的,下面从音视频文件转格式、音视频转码等方面进行介绍。

2.1 音视频文件格式转换

2.2 网络串流流与流媒体文件之间的转换

网络串流转文件,支持RTSP、RTMP、HLS等常用的网络串流协议,文件格式支持常用的音视频文件格式,各位可以多试试,这里以RTSP转mp4为例,命令如下:

ffmpeg -i "rtsp://admin:admin12345@10.45.12.12:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1" -c:v copy -c:a copy  -f mp4 -movflags frag_keyframe output_test.mp4
  • 输入为rtsp实时流:rtsp://admin:admin12345@10.45.12.12:554/Streaming/Channels/101?transportmode=unicast&profile=Profile_1
  • 转换的音频编码和视频编码不变:-c:v copy -c:a copy
  • 输出格式为分片的mp4格式:-f mp4 -movflags frag_keyframe
  • 输出的文件名:output_test.mp4

当然我们也可以把流媒体文件转换为网络串流的格式输出,这里以把mp4文件通过循环播放的方式转为rtsp串流为例,进行说明:

相关示例文件请关注公众号,发送 视频流分析 获取。

2.3 文件封装格式转换

如果只进行文件封装格式的转换,可以非常简单,比如mp4转avi,可使用如下命令:
ffmpeg -i output_test.mp4 output.avi

以上直接转文件封装格式,不改变音视频的编码信息,类似如下命令:
ffmpeg -i output_test.mp4 -c:v copy -c:a copy output.avi

当前ffmpeg支持的音视频文件格式常用的有:

  • 视频格式:MP4、AVI、MKV、MOV、FLV、WMV等。
  • 音频格式:MP3、WAV、AAC、FLAC、OGG等。
  • 图像格式:JPEG、PNG、GIF、BMP等。
  • 流媒体协议:RTMP、HLS、HTTP、RTSP等。

2.4 文件编码格式转换

如果需要对音视频文件格式转换时,改变音视频编码信息,可增加参数选项,定义输出的音视频编码格式,比如
ffmpeg -i input_h264.mp4 -c:v libx265 -crf 28 output_h265.mp4

输入视频编码类型为H264,输出的视频编码类型为H265,音频编码类型不变,-crf为码率控制模式,其值越大质量越差。

ffmpeg支持非常多的编码格式,只要支持的都可以通过参数选项进行转换,可通过命令:ffmpeg -codecs查询。

更多的转码方式请自行探索,下面列举处常用的视频编码格式,c:v 参数中使用的枚举值,如下:

  • libx264 :H.264编码器,广泛用于视频压缩和传输。
  • libx265 :H.265(HEVC)编码器,提供更高的压缩效率和更好的视频质量。
  • libvpx :VP8和VP9编码器,用于WebM格式。
  • libtheora :Theora编码器,用于Ogg格式。
  • mpeg4 :MPEG-4 Part 2编码器,常用于旧版视频编码。
  • msmpeg4 :Microsoft MPEG-4版本3编码器,用于旧版Windows平台。

ffmpeg常用音频的编码格式,-c:a参数枚举值,常用的如下:
-c:a 参数的一些常见枚举值,用于指定FFmpeg中的音频编解码器:

  • aac :高级音频编码(Advanced Audio Coding),通常用于高质量音频压缩。
  • mp3 :MPEG音频层3,一种常用的音频编解码器,用于压缩音频。
  • opus :Opus,一种多用途高效的音频编解码器,适用于各种应用。
  • vorbis :Vorbis,一种开源音频编解码器,常用于Ogg格式。
  • pcm_s16le :PCM有符号16位小端格式,一种无损的未压缩音频格式。
  • pcm_mulaw:是一种音频编解码器,代表着脉冲编码调制(PCM)的μ律编码。它用于电话系统和一些传统音频格式的音频压缩。
  • flac :无损音频编解码器,用于无损音频压缩。
  • ac3 :音频编解码器3,常用于DVD和蓝光光盘的环绕声音频。

有读者询问有没有G711U的音频,其实如果你有aac,可通过如下命令直接转换得到:
ffmpeg -i input.aac -c:a pcm_mulaw outg711u.wav

2.5 文件混合格式转换

在进行流媒体系统开发时,经常需要模拟流媒体服务对外提供HLS、RTSP、RTMP等流媒体访问能力,以MP4文件循环读取并推送rtmp流为例,命令如下:
ffmpeg -re -stream_loop -1 -i .\input_h264.mp4 -vcodec copy -codec copy -f flv rtmp://localhost/live/test
通过此命令把视频文件模拟成RTMP推流到RTMP服务器,再结合OBS、EasyDarwin等工具,可模拟RTMP、RTSP流媒体服务器,提供RTSP、RTMP能力。
mp4模拟RTSP流可参照:https://blog.csdn.net/qq_30714157/article/details/118732111

3 ffmepg实现流媒体协议转换

在流媒体服务领域,特别直播领域,经常会碰到各种流媒体协议的转换,这里如果善用ffmpeg可以很快做出质量很高的转换小程序,这里以RTSP转HLS为例,通过ffmpeg命令转换如下:

ffmpeg -i rtsp://admin:zxm10***@10.45.12.112/h264/ch1/main/av_stream -c copy -f hls -segment_list_flags +live -hls_time 10 -segment_list_size 6  /tmp/hls/hls.m3u8

通过上面的命令,可从rtsp://admin:zxm10***@10.45.12.112/h264/ch1/main/av_stream拉取RTSP流,以HLS切片的形式输出到目录/tmp/hls下,其中:

  • -i:将 rtsp://input_stream_url 替换为您要转换的实际RTSP流的URL。
  • -c copy:相当于-c:v copy 和 -c:a copy 选项将复制视频和音频流而无需重新编码,有助于保留原始质量。
  • -hls_time 10 指定片段的持续时间(以秒为单位)。您可以根据需要调整此值。
  • -hls_list_size 6 确定播放列表中保留的片段数量。您可以根据需要修改此值。
  • -f hls 将输出格式设置为HLS。
  • hls.m3u8 是输出的HLS播放列表文件。

结合nginx,即可实现HLS流媒体服务,可参照文章:https://blog.csdn.net/water1209/article/details/128664784

4 ffmpeg使用总结

以上对ffmpeg经常用到的一些命令进行了说明,ffmpeg是非常强大的工具,如果善于使用,可极大的提高我们在流媒体领域的工作效率。

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐