ffmpeg截取视频指定帧为图片,获取rotation信息并旋转

截取视频指定帧为图片,php ffmpeg扩展已经完美实现:

$movie = new ffmpeg_movie($video_filePath);
$ff_frame = $movie->getFrame(1);
$gd_image = $ff_frame->toGDImage();
$img="./test.jpg";
imagejpeg($gd_image, $img);
imagedestroy($gd_image);

然而问题来了,智能手机拍摄的视频,由于拍摄方向不同,视频会被旋转,并带上meta信息rotate,当你相对视频截取frame图片的时候,如果有rotate信息的视频,frame也是旋转的,因此你需要将截取的图片相应的旋转。
然后php ffmpeg扩展并无法获知rotation信息(php ffmpeg扩展文档),但可以通过ffmpeg命令行获取:
/usr/local/ffmpeg/bin/ffprobe test.mp4 -show_streams  | grep rotate

用php简单封装下如下:
function get_video_orientation($video_path) {
    $cmd =  "/usr/local/ffmpeg/bin/ffprobe " . $video_path . " -show_streams 2>/dev/null";
    $result = shell_exec($cmd);
 
    $orientation = 0;
    if(strpos($result, 'TAG:rotate') !== FALSE) {
        $result = explode("\n", $result);
        foreach($result as $line) {
            if(strpos($line, 'TAG:rotate') !== FALSE) {
                $stream_info = explode("=", $line);
                $orientation = $stream_info[1];
            }
        }
    }
    return $orientation;
}

使用imagerotate()函数就可以旋转截图:
$movie = new ffmpeg_movie($video_filePath);
$frame = $movie->getFrame(1);
$gd = $frame->toGDImage();
if ($orientation = $this->get_video_orientation($video_filePath)) {
    $gd = imagerotate($gd, 360-$orientation, 0);
}
$img="./test.jpg";
imagejpeg($gd, $img);
imagedestroy($gd_image);

最后还有一个麻烦事,不是所有的播放器和浏览器都可对video识别orientation并自动rotate,如果你想对视频进行旋转,可通过ffmpeg命令解决:
/usr/local/ffmpeg/bin/ffmpeg -i input.mp4 -vf 'transpose=3' -metadata:s:v:0 rotate=0 -codec:v libx264 -strict -2 -y output.mp4

对ffmpeg命令和参数不熟悉的可参考如下文档:

时间: 2024-11-03 11:53:54

ffmpeg截取视频指定帧为图片,获取rotation信息并旋转的相关文章

php截取视频指定帧为图片_php技巧

截取视频指定帧为图片,php ffmpeg扩展已经完美实现: $movie = new ffmpeg_movie($video_filePath); $ff_frame = $movie->getFrame(1); $gd_image = $ff_frame->toGDImage(); $img="./test.jpg"; imagejpeg($gd_image, $img); imagedestroy($gd_image); 然而问题来了,智能手机拍摄的视频,由于拍摄方向

怎样把flash的指定帧转为图片?

问题描述 如题 解决方案 解决方案二:我刚开始看flex方面的,对帧不理解.但我知道一个可以对组件截取图片的方法varmyData:BitmapData=newBitmapData(this.width,this.height);myData.draw(this);或者是直接使用ImageSnapshot类也可以截图.貌似截图的范围是真个舞台

Android截取视频帧并转化为Bitmap

   MainActivity如下 package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity; import a

如何使用ffmpeg从视频中提取图片

如何使用ffmpeg从视频中提取图片 你曾想过从一个视频文件中提取图片吗?在Linux下就可以,在这个教程中我将使用ffmpeg来从视频中获取图片. 什么是ffmpeg?What is ffmpeg? ffmpeg是一个非常有用的命令行程序,它可以用来转码媒体文件.它是领先的多媒体框架FFmpeg的一部分,其有很多功能,比如解码.编码.转码.混流.分离.转化为流.过滤以及播放几乎所有的由人和机器创建的媒体文件. 在这个框架中包含有各种工具,每一个用于完成特定的功能.例如,ffserver能够将多

Android截取视频帧并转化为Bitmap示例_Android

MainActivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity;

Android截取视频帧并转化为Bitmap示例

MainActivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity;

基于ffmpeg的视频段截取

问题描述 基于ffmpeg的视频段截取 如何实现对某个视频中特定时间段的视频截取,在ffmpeg的开发下需要对对数据进行解码编码吗? 解决方案 好高深,没有做过,顶你!

封装-基于ffmpeg的视频段截取

问题描述 基于ffmpeg的视频段截取 想基于ffmpeg开发视频段截取的程序,可不可以直接将原视频解封装,然后将要截取视频部分的packet重新封装进输出文件? 解决方案 可以的,视频流媒体服务器就是先将媒体文件里面的对应音视频流分别解出来然后传输给客户端,客户端再分别接受音视频流进行同步播放

关于java问题-正则表达式怎么截取视频路径

问题描述 正则表达式怎么截取视频路径 如果无法观看视频,请尝试安装最新的 windows media player.暴风影音或迅雷看看 播放器. 我只想要http://123123123.wmv这一部分,请问怎么截取 相关文章 java-求教关于程序开发的一个问题? javascript-js问题关于正则表达式截取字符串 关于javascript正则表达式截取字符串的问题 javascript-通过js我已经实现了截取一定区域的图片(图片一共7张),如何把这些截取的图片保存到本地指定路径下 代码