工作中发现一个问题:手机设备在拍摄视频时,是通过竖屏拍摄,文件存放时的缩略图也是竖屏
但是在做播放器时,没经过处理的播放器会发现播放时是横着的。

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)

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

1万+

被折叠的 条评论
为什么被折叠?



