当我尝试在我的应用中上传从我的iPhone捕获的视频时,服务器执行从.mov到.mp4的转换,以便可以在其他平台上播放。但问题是,当我拍摄视频(纵向)并进行转换(使用ffmpeg)然后从服务器播放时,它似乎是旋转的。有什么想法吗?
答案 0 :(得分:28)
FFMPEG将默认行为更改为使用轮播元数据in 2015自动轮播视频源。这是作为v2.7发布的。
如果您的ffmpeg版本是v2.7或更高版本,但您的轮播元数据未得到尊重,则问题很可能是您正在使用基于元数据的自定义轮播。这将导致相同的逻辑应用两次,更改或取消旋转。
除了移除自定义轮播(推荐)之外,还可以选择使用-noautorotate
关闭自动轮播。
ffmpeg -noautorotate -i input.mp4
...
这也可以在一些旧版本中使用。
答案 1 :(得分:19)
您还可以执行的操作是在旋转.mov
时删除QuickTime特定元数据。
这将确保视频在VLC和QuickTime中以相同的方式旋转
ffmpeg -i in.mov -vf "transpose=1" -metadata:s:v:0 rotate=0 out.mov
以下是-metadata
选项(来自http://ffmpeg.org/ffmpeg.html)的文档:
-metadata[:metadata_specifier] key=value (output,per-metadata)
设置元数据键/值对。
可以给出可选的metadata_specifier来设置流或章节的元数据。有关详细信息,请参阅-map_metadata文档。
此选项会覆盖使用-map_metadata设置的元数据。也可以使用空值删除元数据。
例如,用于在输出文件中设置标题:
ffmpeg -i in.avi -metadata title="my title" out.flv
设置第一个音频流的语言:
ffmpeg -i INPUT -metadata:s:a:1 language=eng OUTPUT
答案 2 :(得分:18)
为了完整起见,发生这种情况的原因是iPhone实际上只能以一个固定的方向捕获视频。然后,测量的方向将记录在Apple特定的元数据中。
效果是Quicktime Player在播放期间读取元数据并将视频旋转到正确的方向,但其他软件(例如VLC)不会在实际的编解码器数据中将其显示为方向。
这就是rotate=90
(或vflip
或transpose
等)对某些人有用的原因,而不是其他人的原因。根据录制过程中相机的握持方式,所需的旋转可能是90度,180度甚至270度。如果不阅读元数据,您只需要猜测需要多少轮换,修复一个视频的更改将失败。
答案 3 :(得分:9)
根据您拥有的ffmpeg版本及其编译方式,以下其中一项应该有效......
ffmpeg -vfilters "rotate=90" -i input.mov output.mp4
...或...
ffmpeg -vf "transpose=1" -i input.mov output.mp4
答案 4 :(得分:6)
使用 vflip 过滤器
ffmpeg -i input.mov -vf "vflip" output.mp4
旋转对我不起作用,转置= 1 旋转90度
答案 5 :(得分:4)
所以 - 我也遇到了这个问题,这里我的0.02美元:
1。)有些视频有定向/旋转元数据,有些则没有: MTS(索尼AVHCD)或我拥有的AVI - 没有方向标签。 MOV和MP4(ipad / iphone或三星galaxy note2)有它。
you can check the setting via 'exiftool -Rotation file'.
My videos often have 90 or 180 as the rotation.
2。)ffmpeg - 无论带有metadata-tag的man-page,只是似乎没有在输出文件中设置它。 - 旋转标签始终为'0'。 它正确地在输出中报告它 - 但它永远不会被exiftool报告。 - 但是嘿 - 至少它在那里而且总是0。
3.)旋转角度: 如果你想旋转+/- 90:transpose = 1顺时针90,2 cc 现在,如果你需要180度 - 只需添加此过滤器TWICE。 记住 - 这是你指定的过滤链。 :-) - 进一步了解。
4。)旋转然后缩放: 这很棘手 - 因为你很快就会违反MP4输出格式。 假设你有一个1920x1080的MOV。 旋转90°给出1080x1920 然后我们重新缩放到-1:720 - > 1080 *(720/1920)= 405水平 并且405水平不能被2 - ERROR分割。手动修复此问题。 自动修复它 - 需要一些shell脚本工作。
5.)比例然后旋转: 你可以这样做 - 但最后你得到720x1280。呸。 但这里的过滤器示例将是: “-vf yadif = 1,scale = -1:720,transpose = 1” 这不是我想要的 - 但可以很好地工作。
全部放在一起: - 注意 - '故意错误旋转标签',只是为了演示 - 它不会在输出中显示AT ALL! 这将输入 - 并将其旋转180度,然后重新调整它 - 重置旋转标记。 - 通常iphone / ipad2可以创建180度旋转材料。 你可以把'-metadata Rotation = x'留在线上......
/ usr / bin / ffmpeg -i input-movie.mov -timestamp 2012-06-23 08:58:10 -map_metadata 0:0 -metadata Rotation = 270 -sws_flags lanczos -vcodec libx264 -x264opts me = umh - b 2600k -vf yadif = 1,transpose = 1,transpose = 1,scale = 1280:720 -f mp4 -y output-movie.MP4
我有多个设备 - 比如机顶盒,ipad2,note2,我将所有输入素材(无论是mp4,mov,MTS,AVI)转换为720p mp4,直到现在所有生成的视频都正常播放每个开发者都有(方向,声音)。
希望它有所帮助。
答案 6 :(得分:0)
为了将来自iPhone的纵向格式视频包含在网页中,我刚刚发现以下配方,以纵向显示获取.mp4文件。
步骤1:在QuickTime Player中,将文件导出为480p(我假设720p或1080p也能正常工作)。你再次得到一个.mov文件。
步骤2:在QT Player中获取新文件,然后导出到“iPad,iPhone ......”。你得到一个.m4v文件。
第3步:我正在使用Miro Video Converter,但可能任何随时可用的转换器都可以使用,以获取.mp4文件。
像(啰嗦)魅力一样。
答案 7 :(得分:0)
我用Ipad3拍摄了视频并且它是颠倒的,我想这是某些版本的所有Apple设备的常见情况。除此之外,3分钟长的MOV文件(1920x1090)大小约为500 Mb,这使得它无法轻松共享。我必须将它转换为MP4,并分析我在stackoverflow上找到的所有线程,这里是我使用的ffmpeg的最终代码字符串(ffmpeg ver.2.8.4):
ffmpeg -i IN.MOV -s 960x540 -metadata:s:v rotate="0" -acodec libmp3lame OUT.mp4
如果您不需要更改调整大小和音频编解码器,我想您可能只留下'-metadata:s:v rotate =“0”'。请注意,如果您调整视频大小,则宽度和高度应完全分为4。
答案 8 :(得分:0)
虽然话题很老。 希望这会对某人有所帮助:
获取ffmpeg最新版本:https://www.ffmpeg.org/download.html
对我有用的命令(翻转180度):
ffmpeg -noautorotate -i input.mp4 -filter:v "rotate=PI" output.mp4
当度数由-filter:v "PI/180*degrees"
-filter:v "45*PI/180"
45度
这里有一个很好的解释 https://superuser.com/questions/578321/how-to-rotate-a-video-180-with-ffmpeg
答案 9 :(得分:0)
或者...仅更改现有文件中的标签:
读取当前旋转
exiftool -Rotation <file>
然后,例如:
exiftool -Rotation=180 <file>
将其设置为180