赞
踩
随着5G时代的来到,音视频行业也希望会有一波水涨船高,那我们就从基础开始走一遍音视频技术中的重点,首先我们学习的是ffmpeg,主要学习如何使用ffmpeg,比如命令,比如一些常用的api,最后我们会利用qt+ffmpeg 去做一个音视频播放器,后面有时间在基于qt实现一个视频监控系统。
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。官网地址:https://ffmpeg.org/
ffmpeg大体可以分为8类
以下流程一定需要牢牢的刻在脑海中
输入文件就是mp4,flv。这些文件我们称之为具有封装格式的文件,你可以把它想象成一个盒子。盒子里的数据就是音视频数据。拿到盒子的第一步打开盒子就是demuxer,然后我们拿到的数据就是编码的数据包,因为他是有压缩的,并不是原始的数据,然后进行解码decoder,得到解码之后的数据帧(其实跟原始数据还是有差别的),然后比如拿到了720p的数据帧,但是需要改成480p的数据帧,就需要encoder,变成解码后的数据包,然后需要给别人看重新进行封装就是muxer,封装成一种播放器可以识别的格式,最后播放器解码播放,输出数据。
参数 说明
-version 显示版本。
-formats 显示可用的格式(包括设备)。
-demuxers 显示可用的demuxers。
-muxers 显示可用的muxers。
-devices 显示可用的设备。
-codecs 显示libavcodec已知的所有编解码器。
-decoders 显示可用的解码器。
-encoders 显示所有可用的编码器。
-bsfs 显示可用的比特流filter。
-protocols 显示可用的协议。
-filters 显示可用的libavfilter过滤器。
-pix_fmts 显示可用的像素格式。
-sample_fmts 显示可用的采样格式。
-layouts 显示channel名称和标准channel布局。
-colors 显示识别的颜色名称。
首先通过下面的命令查看一下 mac 上都有哪些设备
ffmpeg -f avfoundation -list_devices true -i “”
参数解释:
-f avfoundation: 这个参数指定了输入设备的类型。在这里,avfoundation是指macOS平台上的一种捕获设备类型,用于捕获音频和视频。
-list_devices true: 这个参数告诉FFmpeg列出所有可用的捕获设备信息。在这种情况下,它会列出所有可用的音频和视频捕获设备。
-i "": 这是输入文件或输入设备的路径。在这里,双引号中间是空的,表示没有指定具体的输入设备,而是在列出设备时显示所有可用的设备。
所以,这个命令的目的是列出macOS平台上所有可用的音频和视频捕获设备。
ffmpeg -f avfoundation -i1 -r30 out.yuv
-i1: 这个参数后面应该跟着要捕获的设备的索引号。然而,在这个命令中,-i1这个参数是无效的,因为应该是-i后面跟着设备的索引号。可能是一个笔误或者误解。正确的应该是-i 1,这表示选择索引号为1的捕获设备。
-r30: 这个参数指定了输出视频的帧率为30帧/秒。 -r参数用于设置输出视频的帧率。
out.yuv: 这是指定输出文件的名称和格式。在这里,输出的视频将以YUV格式保存,并命名为out.yuv。
这个命令的目的是从索引号为1的avfoundation捕获设备捕获视频,并将其保存为YUV格式的文件,输出视频的帧率为30帧/秒。
简单的说就是文件格式的转换,比如将mov转换成MP4,各种各样多媒体文件之间的互转,或者单独处理文件中的音频或视频
抽取音频流命令:
ffmpeg -i input.mp4 -acodec copy -vn out.aac
抽取视频流命令:
ffmpeg -i input.mp4 -vcodec copy -an out.h264
转格式命令:
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。
音视频合并命令:
ffmpeg -i out.h264 -i out.aac -vcodec copy -acodec copy out.mp4
将一个 H.264 视频文件 (out.h264) 和一个 AAC 音频文件 (out.aac) 合并成一个 MP4 文件 (out.mp4)
提取YUV命令:
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv
从输入的 MP4 视频文件 (input.mp4) 中提取视频流,并将其转换为未压缩的 YUV420 格式的视频文件 (out.yuv),同时忽略输入文件的音频流。
该命令的使用场景是处理视频的加水印,去水印,画中画等,所有的滤镜处理都是对解码之后的数据帧进行处理,
添加水印命令:
ffmpeg -i out.mp4 -vf “movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]” water.mp4
裁剪命令:
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4
合并命令
首先需要创建一个写有多个文件名的txt,我们假设 inputs.txt 就是这个文件。然后在文件里写上以下格式的多个flv文件。
file ‘1.flv’
file ‘2.flv’
输入命令ffmpeg -f concat -i inputs.txt -c copy output.flv
视频转JPEG文件命令
ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg
-i test.flv: 这个参数指定了输入文件的路径和名称。在这里,test.flv是要处理的输入FLV视频文件。
-r 1: 这个参数指定了输出图像序列的帧率。在这里,设置为1帧/秒,即每秒输出一张静态图像。
-f image2: 这个参数指定了输出图像的格式。在这里,image2表示输出为图像序列。
image-%3d.jpeg: 这是指定输出图像文件名的格式。%3d表示序列号的格式化,其中%3d表示序列号占据3位数,不足3位的序列号会在前面补0。.jpeg表示输出图像的格式为JPEG。
这个命令的目的是将输入的FLV视频文件test.flv转换为一系列的静态图像,并以image-001.jpeg,image-002.jpeg,… 的格式保存到当前目录中。每秒生成一张静态图像
推流命令:ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
-re: 这个参数告诉FFmpeg以正常速度读取输入文件。如果不加这个参数,FFmpeg会尽可能快地读取输入文件,这在实时流处理中可能会导致问题。
-i out.mp4: 这个参数指定了输入文件的路径和名称。在这里,out.mp4是要处理的输入MP4视频文件。
-c copy: 这个参数指定了视频和音频的编解码方式。在这里,copy表示不对视频和音频进行重新编码,而是直接拷贝原始的编码数据。这样可以加快处理速度,避免降低视频质量。
-f flv: 这个参数指定了输出的格式为FLV。在这里,输出将以FLV格式推流到RTMP服务器上。
rtmp://server/live/streamName: 这是RTMP服务器的地址以及推流的流名称。server是RTMP服务器的地址,live是RTMP服务器上的应用程序名称,streamName是要推流的流名称。
提示:以上举了几个各个种类的一些基础命令,有很多参数这边也没全部拿出来举栗子。有任何使用疑问的都可以去官方文档查看下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。