FFMPEG+SDL播放器

FFMPEG+SDL播放器

架构

image-20240729174027384

目录

  • libavcodec: 提供了一系列编码器的实现。
  • libavformat: 实现在流协议,容器格式及其本IO访问。
  • libavutil: 包括了hash器,解码器和各利工具函数。
  • libavfilter: 提供了各种音视频过滤器。
  • libavdevice: 提供了访问捕获设备和回放设备的接口。
  • libswresample: 实现了混音和重采样。
  • libswscale: 实现了色彩转换和缩放工能。

基本概念

  • 音/视频流:路音/视频称为一路

  • 容器 :MP4、 FLV、MOV等文件格式。可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。

  • channel:声道。在一路音频流中,可以有单声道,双声道或立体声。

FFmpeg处理音视频流程

image-20240729182410714

FFmpeg指令

ffmpeg [global_options] {[input_file_options] -i input_url} …

​ {[output_file_options] output_url} …

信息查询

参数
-formats 显示可用的格式(包括设备)。
-demuxers 显示可用的demuxers。
-muxers 显示可用的muxers。
-devices 显示可用的设备。
-codecs 显示libavcodec已知的所有编解码器。
-decoders 显示可用的解码器。
-encoders 显示所有可用的编码器。
-bsfs 显示可用的比特流filter。
-protocols 显示可用的协议。
-filters 显示可用的libavfilter过滤器。
-pix_fmts 显示可用的像素格式。
-sample_fmts 显示可用的采样格式。
-layouts 显示channel名称和标准channel布局。
-colors 显示识别的颜色名称。

录制指令

1
2
3
4
5
6
7
8
9
ffmpeg -f avfoundation -i1-r30 out.yuv
// -f: 指定使用avfoundation 采集数据
// -i: 指定数据采集微中子 文件索引
// -r: 帧率

ffmpeg -f avfoundation -list_devices // 查看avfoundation支持的设备列表

// 录音命令
ffmpeg -f avfoundation -i:0 out.wav //0 代表 音频设备

分解与复用指令

流拷贝是通过将 copy 参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。 这对于更改容器格式或修改容器级元数据很有用。

image-20240730161016649

1
2
3
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
// ffmpeg -i out.mp4 -an -vcodec copy out.h264 去掉音频
// ffmpeg -i f35.mov -acodec copy -vn out.h264
1
2
3
ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv
// ffmpeg -i out.mp4 -an -vcodec copy out.h264 去掉音频
// ffmpeg -i f35.mov -acodec copy -vn out.h264

处理原始数据

提取YUV数据

1
2
ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p out.yuv
ffplay -s wxh out.yuv
  • -c:v rawvideo 指定将视频转成原始数据
  • -pixel_format yuv420p 指定转换格式为yuv420p

YUV转264

1
ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264

提取PCM数据

1
2
3
ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
ffplay -ar 44100 -ac 2 -f s16le -i out.pcm
// -ar 采样率

PCM转WAV

1
ffmpeg -f s16be -ar 8000 -ac 2 -acodec pcm_s16be -i input.raw output.wav

滤镜命令

在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg区分两种类型的过滤器图形:简单和复杂。某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的fps过滤器会改变帧数,但不会触及帧内容。

复杂的过滤器图使用-filter_complex选项进行配置。 请注意,此选项是全局性的,因为复杂的过滤器图形本质上不能与单个流或文件明确关联。

-lavfi选项等同于-filter_complex。

一个复杂的过滤器图的一个简单的例子是覆盖过滤器,它有两个视频输入和一个视频输出,包含一个视频叠加在另一个上面。 它的音频对应是amix滤波器。

image-20240730165241772

滤镜是根据解码后的数据帧进行操作

image-20240730165547130

添加水印

1
ffmpeg -i out.mp4  -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4

-vf中的 movie 指定logo位置。scale 指定 logo 大小。overlay 指定 logo 摆放的位置。

删除水印
先通过 ffplay 找到要删除 LOGO 的位置

裁剪与合并

裁剪

1
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out1.mp4

合并

创建一个 inputs.txt 文件,文件内容如下:

1
2
3
4
5
file '1.flv'
file '2.flv'
file '3.flv'

ffmpeg -f concat -i inputs.txt -c copy output.flv

视频与图片互转

1
2
3
ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg // 视频转jpeg
ffmpeg -i out.mp4 -ss 00:00:00 -t 10 out.gif // 视频转gif
ffmpeg -f image2 -i image-%3d.jpeg images.mp4 // 图片转视频

直播 推拉流命令

1
2
3
4
5
6
7
8
// 推流
ffmpeg -re -i out.mp4 -c copy -f flv rtmp://server/live/streamName
// 拉流保存
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
// 转流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v copy -f flv rtmp://server/live/h264Stream
// 实时播放
ffmpeg -framerate 15 -f avfoundation -i "1" -s 1280x720 -c:v libx264 -f flv rtmp://localhost:1935/live/room

FFMPEG 日志系统

  1. #include <libavutil/log.h>
  2. av_log_set_level(AV_LOG_DEBUG)
  3. av_log(NULL, AV_LOG_INFO, “…%s\n”, op)