手機(jī)豎屏錄制的視頻月帝,PC 播放時(shí)需要對(duì)解碼后的數(shù)據(jù)做下旋轉(zhuǎn)躏惋。
視頻旋轉(zhuǎn)角度獲取
命令行獲取
使用 ffprobe.exe,ffprobe video.mp4
嚷辅,會(huì)輸出視頻的詳細(xì)信息簿姨。在視頻的 Metadata 的 rotate 屬性如果有值的話就是旋轉(zhuǎn)的角度了。
代碼中獲取
在獲取 video 的 AVStream 時(shí)調(diào)用:
int getVideoRotation(AVStream *st)
{
AVDictionaryEntry *rotate_tag = av_dict_get(st->metadata, "rotate", nullptr, 0);
int rotation = 0;
if (rotate_tag) {
rotation = QString(rotate_tag->value).toInt();
}
while (rotation < 0) {
rotation += 360;
}
while (rotation > 360) {
rotation -= 360;
}
LOG->info("vodeo rotation: {}", rotation);
return rotation;
}
旋轉(zhuǎn) YUV
旋轉(zhuǎn)可以使用 libyuv 這個(gè)庫(kù)簸搞,github 地址扁位。旋轉(zhuǎn)相關(guān)函數(shù)可以看libyuv\include\libyuv\rotate.h
。比如將 I420(ffmpeg 里的 YUV420P)旋轉(zhuǎn) 270 度只需要調(diào)用:
uchar * i420_y = _pBuffer;
uchar * i420_u = i420_y + (width * height);
uchar * i420_v = i420_y + (width * height) * 5 / 4;
uchar * rotated_y = _pRotateBuffer;
uchar * rotated_u = rotated_y + (width * height);
uchar * rotated_v = rotated_y + (width * height) * 5 / 4;
libyuv::I420Rotate(
i420_y, width,
i420_u, (width >> 1),
i420_v, (width >> 1),
rotated_y, height,
rotated_u, (height >> 1), //90度和270度寬高會(huì)互換趁俊,步長(zhǎng)需要注意
rotated_v, (height >> 1),
width, height, libyuv::kRotate270);
libyuv 旋轉(zhuǎn)的同時(shí)還能把格式也轉(zhuǎn)換了贤牛,比如NV12ToI420Rotate
,有需要可以翻頭文件看看则酝。