FFMPEG+SDL播放器
FFMPEG+SDL播放器
Edmend ZhangFFMPEG+SDL播放器
架构
目录
- libavcodec: 提供了一系列编码器的实现。
- libavformat: 实现在流协议,容器格式及其本IO访问。
- libavutil: 包括了hash器,解码器和各利工具函数。
- libavfilter: 提供了各种音视频过滤器。
- libavdevice: 提供了访问捕获设备和回放设备的接口。
- libswresample: 实现了混音和重采样。
- libswscale: 实现了色彩转换和缩放工能。
基本概念
音/视频流:路音/视频称为一路流
容器 :MP4、 FLV、MOV等文件格式。可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。
channel:声道。在一路音频流中,可以有单声道,双声道或立体声。
FFmpeg处理音视频流程
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 | ffmpeg -f avfoundation -i1-r30 out.yuv |
分解与复用指令
流拷贝是通过将 copy 参数提供给-codec选项来选择流的模式。它使得ffmpeg省略了指定流的解码和编码步骤,所以它只能进行多路分解和多路复用。 这对于更改容器格式或修改容器级元数据很有用。
1 | ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv |
1 | ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv |
处理原始数据
提取YUV数据
1 | ffmpeg -i input.mp4 -an -c:v rawvideo -pixel_format yuv420p 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 | ffmpeg -i out.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm |
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滤波器。
滤镜是根据解码后的数据帧进行操作
添加水印
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 | file '1.flv' |
视频与图片互转
1 | ffmpeg -i test.flv -r 1 -f image2 image-%3d.jpeg // 视频转jpeg |
直播 推拉流命令
1 | // 推流 |
FFMPEG 日志系统
- #include <libavutil/log.h>
- av_log_set_level(AV_LOG_DEBUG)
- av_log(NULL, AV_LOG_INFO, “…%s\n”, op)