前段时间老是有人问我,有没有其他格式的视频或音频提供,愿意有偿获取,如果其对ffmpeg比较熟悉,就不会那么麻烦。经常从事流媒体领域开发和研究工作的人,ffmpeg应该是我们最常用到的流媒体工具,很多流媒体软件都直接集成了ffmpeg库或者工具程序,直接使用其协议接入、协议转换、流媒体封装、流媒体编解码等能力或者库实现对应的功能。本文主要介绍使用我们在流媒体开发调试过程中比较常用的ffmpeg命令,对其命令及使用场景进行介绍,如果后续用到,可直接查询本文相关内容。
ffmpeg安装部署
不做详细介绍,进官网,选择操作系统,下载安装即可。官网地址如下:https://ffmpeg.org/
也可下载源码,自己编译。
通过安装包安装后,相关执行路径会自动添加到系统环境变量里,不需要自己添加,可在cmd里直接运行:ffmeg -version
如果返回版本信息,则说明安装成功。
ffmpeg命令格式介绍
命令格式:
ffmpeg -i [输入文件名/地址] [参数选项] -f [格式] [输出文件/地址]
参数解释:
- -i后为媒体流的输入,可以为文件,也可以是视频流地址
- [参数选项]定义流媒体转换的参数,详细定义了转换的方式
- -f 后为输出的媒体流格式,定义输出媒体流的输出格式
- 之后直接为输出媒体流到文件或者到推送地址
例如: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),也可以转码为其他格式,比如:
ffmpeg实现流媒体转码
我们经常看到网上分享很多离线或在线工具,对音视频文件类型进行转换,其基本上是使用了ffmpeg的库或者直接封装了ffmpeg的程序来实现的,因为ffmpeg支持的文件封装协议非常全、编解码库支持的音视频编码类型也非常的全,由于其基于C编写的,因此整个程序/库也非常的小巧、稳定且效率高,是此类开源软件中应用非常广泛的,下面从音视频文件转格式、音视频转码等方面进行介绍。
网络串流流与流媒体文件之间的转换
网络串流转文件,支持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串流为例,进行说明。
文件封装格式转换
如果只进行文件封装格式的转换,可以非常简单,比如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等。
文件编码格式转换
如果需要对音视频文件格式转换时,改变音视频编码信息,可增加参数选项,定义输出的音视频编码格式,比如
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
文件混合格式转换
在进行流媒体系统开发时,经常需要模拟流媒体服务对外提供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
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流媒体服务,可参照文章:
ffmpeg使用总结
以上对ffmpeg经常用到的一些命令进行了说明,ffmpeg是非常强大的工具,如果善于使用,可极大的提高我们在流媒体领域的工作效率。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。