【C++】开源:FFmpeg音视频库介绍与视频播放器示例

★,°:.☆( ̄▽ ̄)/$:.°★
这篇文章主要介绍FFmpeg音视频库。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路

文章目录

    • :smirk:1. FFmpeg音视频库介绍
    • :blush:2. 环境配置
    • :satisfied:3. FFmpeg常用指令
      • 视频
      • 音频
    • :satisfied:4. 视频播放器示例

1. FFmpeg音视频库介绍

ffmpeg官网:http://www.ffmpeg.org/

FFmpeg是一款开源的音视频库,提供了处理音视频文件、转码、解码、编码、播放等功能。它是一个完整的跨平台解决方案,支持多种音视频格式,并提供多种API和工具来处理音视频数据。

FFmpeg框架的基本组成包括:AVFormet封装模块、AVCodec编解码模块、AVFilter滤镜模块、AVDeviceAVUtil等模块库。

下面简单介绍一些FFmpeg库的基础知识:

  1. 编码器与解码器
    FFmpeg提供了多种编码器和解码器来处理不同的音视频格式,例如H.264、MPEG-4、AAC等。可以使用avcodec_find_encoder和avcodec_find_decoder函数查找可用的编码器和解码器,并使用avcodec_open2函数打开需要使用的编码器或解码器。
  1. 格式封装与解封装
    FFmpeg可以处理多种音视频文件格式,例如MP4、AVI、WAV等。它使用封装格式来将音视频流打包到一个容器中。常见的封装格式有MP4、AVI、FLV、MKV等。可以使用avformat_open_input函数打开音视频文件,并使用av_read_frame函数读取文件中的音视频数据。
  1. 帧与数据包
    在FFmpeg中,音视频数据被组织成帧和数据包。音频数据通常被组织成PCM数据,每个样本对应一帧数据;而视频数据则被组织成一系列关键帧和非关键帧。
  1. 协议
    FFmpeg可以处理不同的音视频流传输协议,例如RTSP、RTMP、HTTP等。可以使用avformat_open_input函数打开网络音视频流,并使用av_read_frame函数读取数据包。

2. 环境配置

下面进行环境配置:

# apt安装
sudo apt install ffmpeg
ffmpeg -version
# 也可选择源码安装

3. FFmpeg常用指令

视频

采集摄像头:

ffmpeg -f video4linux2 -s  640x480 -pixel_format yuyv422  -i /dev/video0  out.mp4 -loglevel debug
ffmpeg -f x11grab -framerate 25 -video_size 1280*720 -i :0.0 out.mp4	# 采集x11桌面

视频格式转换:

ffmpeg -i input.avi output.mp4

帧率转换:

ffmpeg -i input.avi -r 24 output.mp4

多路视频拼接命令行:

# 两路视频横向拼接
ffmpeg -i out1.mp4 -i out2.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[a];[a][1:v]overlay=w" out.mp4
# 两路视频纵向拼接
ffmpeg -i out1.mp4 -i out2.mp4 -filter_complex "[0:v]pad=iw:ih*2[a];[a][1:v]overlay=0:h" out.mp4
# 三路视频横向拼接
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -filter_complex "[0:v]pad=iw*3:ih*1[a];[a][1:v]overlay=w[b];[b][2:v]overlay=2.0*w" out.mp4 
# 三路视频纵向拼接
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -filter_complex "[0:v]pad=iw:ih*3[a];[a][1:v]overlay=0:h[b];[b][2:v]overlay=0:2.0*h" out.mp4
# 四路视频2X2排列
ffmpeg -i out1.mp4 -i out2.mp4 -i out3.mp4 -i out4.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[a];[a][1:v]overlay=w[b];[b][2:v]overlay=0:h[c];[c][3:v]overlay=w:h" out.mp4

视频推流:

ffmpeg -r 100 -i /dev/video0 -f flv udp://192.168.111.121:9666
ffplay -max_delay 10 udp://192.168.111.121:9666
# 原始音视频推流
ffmpeg  -f alsa -ar 11025 -ac 2 -i hw:0 -i /dev/video0 -f flv udp://192.168.111.121:9666

音频

音频格式转换:

ffmpeg64 -i null.ape -ar 44100 -ac 2 -ab 16k -vol 50 -f mp3 null.mp3
注:-i代表输入参数
          -acodec aac(音频编码用AAC) 
          -ar 设置音频采样频率
          -ac  设置音频通道数
          -ab 设定声音比特率
          -vol <百分比> 设定音量

# 或创建list包含所需音频
ffmpeg -safe 0 -f concat -i list.txt -c copy out.wav

音频拼接:

# 新建列表,包含所需音频
touch list.txt
file '1.mp3'
file '2.mp3'
ffmpeg -f concat -i list.txt -c copy out.mp3

音频录制:

ffmpeg -y -f alsa -i hw:0 -t 00:00:03 -ar 8000 -ac 1 out.mp3

音频推流:

ffmpeg  -f alsa -i hw:0 -ar 11025 -ac 1 -f flv udp://192.168.111.121:9666

其他参考:

视频播放器的实现:http://t.csdn.cn/N6Vuo

音视频播放器实现:http://t.csdn.cn/zJuXn

通过opencv读取摄像头:http://t.csdn.cn/mGCog

推送摄像头 rtsp 流:http://t.csdn.cn/YrLMm

4. 视频播放器示例

视频播放器项目Github地址:https://github.com/pockethook/player.git

视频播放器项目主要使用FFmpeg做视频编解码,用SDL做渲染。

编译运行:

make
./player xxx.mp4

在这里插入图片描述

以上。

你可能感兴趣的:(c++开源项目学习,ffmpeg,音视频,c++)