[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV视频lO接口

简介: [笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV视频lO接口

一、OpenCV VideoCapture打开摄像头接口讲解和源码分析

VideoCapture

可以打开数据源(文件/摄像机/rtsp流)

以下两种方案打开:

  • bool open ( int index )
  • VideoCapture cap(index)

bool open ( int index )

VideoCapture cap(index)

二、OpenCV VideoCapture打开视频流接口讲解和源码分析

三、VideoCapture release关闭和空间释放源码分析

四、OpenCV read读取一帧视频接口讲解和源码分析

五、使用OpenCV VideoCapture播放视频示例

isOpen判断打开失败原因

1.opencv_ffmpeg.dll 没有放入bin

2. 尚未得知

注意:我使用的opencv-3.4.1/3.4.16 版本 无法打开MP4 我换avi格式 isOpen就成功了,怀疑是x264.dll 以及相关没有导致不支持mp4

读取Frame(解码+转rgb)

Read()

VideoCapture video;
Mat frame;
video.read(frame)

流形式

VideoCapture video;
Mat frame;
video >> frame;

解码+转化颜色

if (!video.grab())
{
  break;
}
//转换颜色格式
if (!video.retrieve(frame))
{
  break;
}

解码和转化颜色分割开来,类似利于实现解码一个线程和渲染一个线程的道理

源码

int main(int argc, char *argv[])
{
  VideoCapture video;
  cv::String strPath = ".\\res\\test.avi";
  video.open(strPath);
  if (!video.isOpened())
  {
    cout << "open video failed!" << endl;
    getchar();
    return -1;
  }
  cout << "open video success!" << endl;
  namedWindow("video");
  Mat frame;
  for (;;)
  {
    //if (!video.read(frame))
    //{
    //  break;
    //}
    //读帧,解码
    if (!video.grab())
    {
      break;
    }
    //转换颜色格式
    if (!video.retrieve(frame))
    {
      break;
    }
    if (frame.empty()) break;
    imshow("video", frame);
    waitKey(30);
  }
  getchar();
  return 0;
}

六、获取视频和相机的属性并分析获取视频属性的源码

获取视频、相机属性

  • CAP_PROP_FPS帧率
  • CAP_PROP_FRAME_COUNT总帧数
  • CAP_PROP_POS_FRAMES 播放帧的位置
  • CAP_PROP_FRAME_WIDTH
  • CAP_PROP_FRAME_HEIGHT

源码

int main(int argc, char *argv[])
{
  VideoCapture video;
  video.open(".\\res\\test.avi");
  if (!video.isOpened())
  {
    cout << "open video failed!" << endl;
    getchar();
    return -1;
  }
  cout << "open video success!" << endl;
  namedWindow("video");
  Mat frame;
  int fps = video.get(CAP_PROP_FPS);
  int s = 30;
  if (fps != 0)
    s = 1000 / fps;
  cout << "fps is " << fps << endl;
  int fcount = video.get(CAP_PROP_FRAME_COUNT);
  cout << "total frame is " << fcount << endl;
  cout << "total sec is " << fcount / fps << endl;
  cout << "CAP_PROP_FRAME_WIDTH " << video.get(CAP_PROP_FRAME_WIDTH) << endl;
  cout << "CAP_PROP_FRAME_HEIGHT " << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
  s = s / 2;
  int f = 0;
  for (;;)
  {
    video.read(frame);
    if (frame.empty()) break;
    imshow("video", frame);
    waitKey(s);
  }
  getchar();
  return 0;
}

七、使用opencv实现视频播放位置跳转

建议:使用帧数进行跳转;使用毫秒数跳转,需要先转为帧数,再进行帧数跳转

获得当前帧号

  • CAP PROP POS FRAMES
video.get( CAP PROP POS FRAMES);

设置跳转帧

video.set( CAP PROP POS FRAMES,0);//跳到 第一帧

源码

int main(int argc, char *argv[])
{
  VideoCapture video;
  video.open(".\\res\\test.avi");
  if (!video.isOpened())
  {
    cout << "open video failed!" << endl;
    getchar();
    return -1;
  }
  cout << "open video success!" << endl;
  namedWindow("video");
  Mat frame;
  int fps = video.get(CAP_PROP_FPS);
  int s = 30;
  if (fps != 0)
    s = 1000 / fps;
  cout << "fps is " << fps << endl;
  int fcount = video.get(CAP_PROP_FRAME_COUNT);
  cout << "total frame is " << fcount << endl;
  cout << "total sec is " << fcount / fps << endl;
  cout << "CAP_PROP_FRAME_WIDTH " << video.get(CAP_PROP_FRAME_WIDTH) << endl;
  cout << "CAP_PROP_FRAME_HEIGHT " << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
  s = s / 2;
  int f = 0;
  for (;;)
  {
    video.read(frame);
    if (frame.empty()) break;
    int cur = video.get(CAP_PROP_POS_FRAMES);
    if (cur > 90)
    {
      video.set(CAP_PROP_POS_FRAMES, 0);
      continue;
    }
    imshow("video", frame);
    waitKey(s);
  }
  getchar();
  return 0;
}

八、通过VideoWrite的open创建视频文件并分析源码

VideoWriter

open

CV_WRAP virtual bool open(
  const String& filename, 
  int fourcc, 
  double fps,
  Size frameSize,
  bool isColor = true
);

create

static Ptr<IVideoWriter> create(
  const String& filename, 
  int fourcc, 
  double fps,
  Size frameSize, 
  bool isColor = true
);

fourcc格式

九、通过VideoWrite的write创建视频文件并分析源码

VideoWriter

write

CV_WRAP virtual void write(const Mat& image)

writeFrame

十、以h264格式录制并预览摄像机视频代码演示

摄像头打开失败的几个原因

openH264dll少了

openh264开源地址

源码

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
  VideoCapture cam(0);
  if (!cam.isOpened())
  {
    cout << "cam open failed!" << endl;
    getchar();
    return -1;
  }
  cout << "cam open success!" << endl;
  namedWindow("cam");
  Mat img;
  VideoWriter vw;
  int fps = cam.get(CAP_PROP_FPS);
  if (fps <= 0)fps = 25;
  vw.open("out.avi",
    VideoWriter::fourcc('X', '2', '6', '4'),
    fps,
    Size(cam.get(CAP_PROP_FRAME_WIDTH),
      cam.get(CAP_PROP_FRAME_HEIGHT))
    );
  if (!vw.isOpened())
  {
    cout << "VideoWriter open failed!" << endl;
    getchar();
    return -1;
  }
  cout << "VideoWriter open success!" << endl;
  for (;;)
  {
    cam.read(img);
    if (img.empty())break;
    imshow("cam", img);
    vw.write(img);
    if (waitKey(5) == 'q') break;
  }
  waitKey(0);
  return 0;
}

十一、使用ffmpeg工具实现音频抽取、剪切和与视频

使用ffmpeg工具抽取音频

ffmpeg.exe -i 1.avi -vn 1.mp3

-i表示源

-vn表示不转换视频

使用ffmpeg剪切音频

ffmpeg -ss 0:0:30 -t 0:0:20 -i input.mp -c copy output.mp

使用ffmpeg工具音视频合并

ffmpeg.exe -i 1.mp3 -i 1.mp4 -c copyout.mp

=========================================

要源码的请私密


相关文章
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
2016 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
编解码 语音技术 内存技术
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
《FFmpeg开发实战:从零基础到短视频上线》一书中的“5.1.2 把音频流保存为PCM文件”章节介绍了将媒体文件中的音频流转换为原始PCM音频的方法。示例代码直接保存解码后的PCM数据,保留了原始音频的采样频率、声道数量和采样位数。但在实际应用中,有时需要特定规格的PCM音频。例如,某些语音识别引擎仅接受16位PCM数据,而标准MP3音频通常采用32位采样,因此需将32位MP3音频转换为16位PCM音频。
604 0
FFmpeg开发笔记(五十八)把32位采样的MP3转换为16位的PCM音频
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
1257 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
598 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
Ubuntu Linux C语言
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
本文介绍了在Ubuntu 18.04系统上编译安装OpenCV 3.4.0及其扩展包opencv_contrib 3.4.0的详细步骤,包括下载源码、安装依赖、配置CMake和编译安装,以及常见问题的解决方法。
1567 1
Ubuntu安装笔记(二):ubuntu18.04编译安装opencv 3.4.0 opencv_contrib3.4.0
|
编解码 监控 网络协议
如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频
本文详细介绍了如何使用FFmpeg实现RTSP推送H.264和H.265(HEVC)编码视频。内容涵盖环境搭建、编码配置、服务器端与客户端实现等方面,适合视频监控系统和直播平台等应用场景。通过具体命令和示例代码,帮助读者快速上手并实现目标。
4185 6
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
1724 1
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
915 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
计算机视觉 Python
FFMPEG学习笔记(一): 提取视频的纯音频及无声视频
本文介绍了如何使用FFmpeg工具从视频中提取纯音频和无声视频。提供了具体的命令行操作,例如使用`ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3`来提取音频,以及`ffmpeg -i input.mp4 -c:v copy -an output.mp4`来提取无声视频。此外,还包含了一个Python脚本,用于批量处理视频文件,自动提取音频和生成无声视频。
1824 1

推荐镜像

更多
  • qt