ffmpeg filter 实现画面旋转

本文介绍了一种利用FFmpeg库解决手机竖屏拍摄视频,在播放时出现横屏显示的问题的方法。详细阐述了如何通过解析视频元数据获取旋转角度,并利用FFmpeg的过滤器功能实现视频画面的实时旋转及黑边填充。

工作中发现一个问题:手机设备在拍摄视频时,是通过竖屏拍摄,文件存放时的缩略图也是竖屏

但是在做播放器时,没经过处理的播放器会发现播放时是横着的。
在这里插入图片描述
VLC是竖屏的
在这里插入图片描述在这里插入图片描述
但是其分辨率却是横屏的格式。
在这里插入图片描述

究其原因是因为存放时确实是按照横着来存放的,但是在mp4中会有一个参数标志着播放时需要旋转的角度。rotate。

1.如何找到标志着需要旋转的角度:

在文件格式描述符AVFormatContext的AVStream中有个源数据metadata,用来描述文件的响应信息,将其打印出来发现会有相对应操作的参数,其中就有rotate参数。

AVStream *stream = m_pVideoAVSt;
AVDictionaryEntry *m = NULL;
while ((m = av_dict_get(stream->metadata, "", m, AV_DICT_IGNORE_SUFFIX)) != NULL)
{
   
   
	printf("Metadata: Key:%s , value:%s\n", m->key, m->value);
}

在这里插入图片描述
可以看到旋转的角度是90度。那既然信息已经得到,就寻找方法开搞。

2.用什么方法进行旋转

查找了一下ffmpeg对于播放时旋转画面的操作:

ffmpeg -i fan.jpg -vf transpose=2 -y transpose2.png

ok,既然ffmpeg有相对应的指令去操作,那就有相对应的方法去操作。

查找了一下,发现-vf是添加滤镜的意思,发现ffmpeg库中有个叫avfilter的东西,其实就是过滤器。

3.使用ffmpeg过滤器旋转

在这里插入图片描述
可以通过多个过滤器/滤镜对视频或音频进行处理,导出一个或者多个视频或音频。
滤镜的功能很强大,可以加字幕、长度剪切、缩放、画面剪裁、加水印、拼接视频或音频、对画面进行旋转或者镜像处理、加黑边、调音量。

而这里对于视频的旋转,因为画面旋转成竖屏,所以需要两边加个黑边,只需要两个滤镜就够了。

(1)在播放开始前,判断是否旋转,并且旋转多少度,创建过滤器:
头文件:

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavfilter/avfilter.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libavutil/opt.h>
#include <libavutil/imgutils.h>
			AVStream *stream = m_pVideoAVSt;
			AVDictionaryEntry *m = NULL;
			while ((m = av_dict_get(stream->metadata, "", m, AV_DICT_IGNORE_SUFFIX)) != NULL)
			{
   
   
				printf("Metadata: Key:%s , value:%s\n", m->key, m->value)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值