【VS开发】【视频开发】利用ffmpeg+opencv实现画中画
需求:把两路视频合成一路,即一个画面同时显示两路视频,其中一路缩小成小视频叠在大视频上面,和电视机的画中画效果类似。
思路:用h264编码的视频举例,文件中存储的es流是h264,经过解码成yuv,yuv可以转换成rgb格式。把小视频的rgb复制到大视频需要被覆盖的位置上。将重新合成的rgb转换成yuv,利用ffmpeg 或 x264重新编码出新的视频即可。
方法:编解码还是利用ffmpeg 。 ffmpeg 解码两路视频,解码后都是yuv。利用ffmpeg· 的sws_getContext 函数改变小图的大小。之后利用OpenCV完成两个图片的合成(opencv这种高大上的库被我用成了这样····实在汗颜。其实此处的合并rgb可以自己写算法实现,本质是把小图的rgb复制到大图的对应位置上。)合成好后将rbg转成yuv格式,利用x264重新编码成h264
,就看到了大视频左上角有个小视频了。
代码思路:
两个线程,各自解码,主视频的线程解码一帧后通知副视频的线程进行解码并转化图片大小,副视频的线程解码完成后通知主线程合成视频并编码。合成视频的时候用opencv很简单,直接把yuv转化成rgb,之后在主视频上设置敏感区,把小视频叠加上就行。
主副线程解码套路一样,ffmpeg的基本使用套路。把yuv转成opencv mat类型的rgb套路也一样,上副视频解码线程的代码进行说明。
全局变量:
cv::Mat littlergb,bigrgb;//大小视频的rgb
cv::Mat littleframe,bigframe;//大小视频的yuv
副视频解码线程内的代码:
while(av_read_frame(pInputFormatContext, &InPack) >=0)
{
len = avcodec_decode_video2(pInputCodecContext, &OutFrame, &nComplete, &InPack);//解码视频
if (nComplete>0)
{
if (GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case MY_MSG_DECODE:
sws_scale(m_pSwsContext,OutFrame.data,OutFrame.linesize, 0,OutFrame.height,dst->data,dst->linesize);//转换图片大小
memcpy(littleframe.data,dst->data[0], 640*480); //以下将ffmpeg的yuv数据存到opencv的mat类型中。即opencv存储的yuv数据
memcpy(littleframe.data+640*480,dst->data[1], 640*480/4);
memcpy(littleframe.data+640*480*5/4,dst->data[2], 640*480/4);
SetEvent(hEncodeEvent);
break;
}
}
}
av_free_packet(&InPack);
}
合并图片直接用opencv,代码如下:
cv::cvtColor(littleframe, littlergb,CV_YUV2BGR_I420);
cv::cvtColor(bigframe, bigrgb,CV_YUV2BGR_I420); //以上yuv转rgb
Mat roi(bigrgb,Rect(0,0,640,480));//大图上设置敏感区
littlergb.copyTo(roi); //把小图拷贝过去
Mat outframe;
cv::cvtColor(bigrgb, outframe,CV_BGR2YUV_I420); //rgb到yuv
这样就获得了合并后的图片的yuv。
之后进行编码即可。编码出来的视频就是画中画了。
【VS开发】【视频开发】利用ffmpeg+opencv实现画中画的更多相关文章
- 音视频开发-FFmpeg
音视频开发是个非常复杂的,庞大的开发话题,初涉其中,先看一下结合 OEIP(开源项目) 新增例子. 可以打开flv,mp4类型文件,以及rtmp协议音视频数据,声音的播放使用SDL. 把采集的麦/声卡 ...
- 开发环境配置--Ubuntu+Qt4+OpenCV(一)
同系列的文章 1. 开发环境配置--Ubuntu+Qt4+OpenCV(一) 2. 开发环境配置--Ubuntu+Qt4+OpenCV(二) 3. 开发环境配置--Ubuntu+Qt4+OpenCV( ...
- 浅谈iOS视频开发
浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从 ...
- iOS 视频开发学习
原文:浅谈iOS视频开发 这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我 ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
问题描述:获得flv视频的缩略图和视频时间长度 谷歌了半天发现可以使用Ffmpeg获得视频的一些信息,先介绍一下FFMEPG 这里简单说一下:FFmpeg是用于录制.转换和流化音频和视频的完整解决方案 ...
- 短视频技术详解:Android端的短视频开发技术
在 <如何快速实现移动端短视频功能?>中,我们主要介绍了当前短视频的大热趋势以及开发一个短视频应用所涉及到的功能和业务.在本篇文章中,我们主要谈一谈短视频在Android端上的具体实现技术 ...
- Android 音视频开发(一):PCM 格式音频的播放与采集
什么是 PCM 格式 声音从模拟信号转化为数字信号的技术,经过采样.量化.编码三个过程将模拟信号数字化. 采样 顾名思义,对模拟信号采集样本,该过程是从时间上对信号进行数字化,例如每秒采集 44100 ...
- 【秒懂音视频开发】23_H.264编码
本文主要介绍一种非常流行的视频编码:H.264. 计算一下:10秒钟1080p(1920x1080).30fps的YUV420P原始视频,需要占用多大的存储空间? (10 * 30) * (1920 ...
随机推荐
- python3爬虫--反爬虫应对机制
python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需 ...
- 08 c++中运算符重载(未完成)
参考:轻松搞定c++语言 定义:赋予已有运算符多重含义,实现一名多用(比较函数重载) 运算符重载的本质是函数重载 重载函数的格式: 函数类型 operator 运算符名称(形参表列) { 重载实体 ...
- 《BUG创造队》第四次作业:基于原型的团队项目需求调研与分析
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验八 团队作业4:基于原型的团队项目需求调研与分析 团队名称 BUG创造队 作业学习目标 (1)体验以原型设计为基础的团队 ...
- idea去除mybatis的xml那个恶心的绿色背景
https://my.oschina.net/qiudaozhang/blog/2877536
- javaWeb开发中entityBean的习惯用法
entity bean的作用是将与数据库交互的过程封装成对象,在servelet编写的过程中,只需要会写java,不必考虑与数据库交互细节. 实体类: 基本与数据库的表相对应,表示一个实在的对象. 例 ...
- Java项目使用 Tomcat 部署 Linux 服务器
一.安装 Java 环境 1 下载 jdk 8 yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 设置 centos7 环境变量 v ...
- webpack的plugin原理
plugin是webpack生态的重要组成,它为用户提供了一种可以直接访问到webpack编译过程的方式.它可以访问到编译过程触发的所有关键事件. 1. 基本概念 1. 如何实现一个插件 1. plu ...
- hasura skor 一个pg 的event trigger 扩展
hasura skor 是一个hasura 团队早期的event triggerpg 扩展,新的推荐使用graphql engine 参考架构 缺点 只有在skor 运行的时候,数据才可以被捕捉处理 ...
- 洛谷P3534 [POI2012] STU
题目 二分好题 首先用二分找最小的绝对值差,对于每个a[i]都两个方向扫一遍,先都改成差满足的形式,然后再找a[k]等于0的情况,发现如果a[k]要变成0,则从他到左右两个方向上必会有两个连续的区间也 ...
- PHP 之Mysql优化
一.建立索引 普通索引 index: 对关键字没有要求. 唯一索引 unique index: 要求关键字不能重复.同时增加唯一约束. 主键索引 primary key: 要求关键字不能重复,也不能为 ...