本文将介绍 FFmpeg 如何播放 RTSP/Webcam/File 流。流程如下:
RTSP/Webcam/File > FFmpeg open and decode to BGR/YUV > OpenCV/OpenGL display
- 代码: https://github.com/ikuokuo/rtsp-wasm-player, 子模块 rtsp-local-player
FFmpeg 准备
git clone https://github.com/ikuokuo/rtsp-wasm-player.git
cd rtsp-wasm-player
export MY_ROOT=`pwd`
# ffmpeg: https://ffmpeg.org/
git clone --depth 1 -b n4.4 https://git.ffmpeg.org/ffmpeg.git $MY_ROOT/3rdparty/source/ffmpeg
cd $MY_ROOT/3rdparty/source/ffmpeg
./configure --prefix=$MY_ROOT/3rdparty/ffmpeg-4.4 \
--enable-gpl --enable-version3 \
--disable-programs --disable-doc --disable-everything \
--enable-decoder=h264 --enable-parser=h264 \
--enable-decoder=hevc --enable-parser=hevc \
--enable-hwaccel=h264_nvdec --enable-hwaccel=hevc_nvdec \
--enable-demuxer=rtsp \
--enable-demuxer=rawvideo --enable-decoder=rawvideo --enable-indev=v4l2 \
--enable-protocol=file
make -j`nproc`
make install
ln -s ffmpeg-4.4 $MY_ROOT/3rdparty/ffmpeg
./configure
手动选择了:解码 h264,hevc 、解封装 rtsp,rawvideo 、及协议 file ,以支持 RTSP/Webcam/File 流。
其中, Webcam 因于 Linux ,故用的 v4l2。 Windows 可用 dshow, macOS 可用 avfoundation ,详见 Capture/Webcam。
这里依据自己需求进行选择,当然,也可以直接编译全部。
FFmpeg 拉流
拉流过程,主要涉及的模块:
- avdevice: IO 设备支持(次要,为了 Webcam)
- avformat: 打开流,解封装,拿小包(主要)
- avcodec: 收包,解码,拿帧(主要)
- swscale: 图像缩放,转码(次要)
解封装,拿包
完整代码,见 stream.cc 。
打开输入流:
// IO 设备注册 for Webcam
avdevice_register_all();
// Network 初始化 for RTSP
avformat_network_init();
// 打开输入流
format_ctx_ = avformat_alloc_context();
avformat_open_input(&format_ctx_, "rtsp://", nullptr, nullptr);
找出视频流:
avformat_find_stream_info(format_ctx_, nullptr);
video_stream_ = nullptr;
for (unsigned int i = 0; i < format_ctx_->nb_streams; i++) {
auto codec_type = format_ctx_->streams[i]->codecpar->codec_type;
if (codec_type