使用 ffmpeg python 阅读视频时如何忽略自动旋转?
How to ignore auto rotation when reading videos with ffmpeg python?
当使用ffmpeg-python读取视频时,如果视频元数据包含“旋转”属性,似乎默认情况下ffmpeg会根据旋转值转置传入的字节。
我想取消自动旋转。我尝试了以下,但没有成功:
import ffmpeg
process = (
ffmpeg
.input(filename)
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=0, vsync='0')
.global_args('-noautorotate')
.run_async(pipe_stdout=True)
)
代码运行没有任何问题,但旋转没有被忽略,正如我预期的那样。
据此:https://gist.github.com/vxhviet/5faf792f9440e0511547d20d17208a76,noautorotate 参数应在输入前传递。
我尝试了以下方法:
process = (
ffmpeg
.global_args('-noautorotate')
.input(filename)
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=0, vsync='0')
.run_async(pipe_stdout=True)
)
同样没有成功:
AttributeError: module 'ffmpeg' has no attribute 'global_args'
有什么建议吗?
编辑
将 noautorotate 作为 kwargs 传递也不起作用(阅读后的视频大小为 0)
process = (
ffmpeg
.input(self.file, **{'noautorotate':''})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=1, vsync='0')
.run_async(pipe_stdout=True)
)
将 **{'noautorotate':''}
替换为 **{'noautorotate':None}
。
正确的语法:
process = (
ffmpeg
.input(self.file, **{'noautorotate':None})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=1, vsync='0')
.run_async(pipe_stdout=True)
)
使用**{'noautorotate':''}
时,FFmpeg输出错误:
Option noautorotate (automatically insert correct rotate filters) cannot be applied to output url -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
Error parsing options for output file .
Error opening output files: Invalid argument
为了测试,我们可以添加 .global_args('-report')
,并查看日志文件。
正在执行以下命令:
process = (
ffmpeg
.input('input.mkv', **{'noautorotate':None})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', vsync='0')
.global_args('-report')
.run_async()
.wait()
)
日志文件显示了内置的 FFmpeg 命令行 - 看起来正确:
ffmpeg -noautorotate -i input.mkv -f rawvideo -pix_fmt yuv420p -vsync 0 pipe: -report
正在执行以下命令:
process = (
ffmpeg
.input('input.mkv', **{'noautorotate':''})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', vsync='0')
.global_args('-report')
.run_async()
.wait()
)
日志文件显示了以下内置的 FFmpeg 命令行:
ffmpeg -noautorotate -i input.mkv -f rawvideo -pix_fmt yuv420p -vsync 0 pipe: -report
在 -i
之前只有一个额外的 space,但出于某种原因 FFmpeg 将其解释为 URL(我认为这可能是与 Unicode 相关的问题 - 空字符串被解释为不是 space).
的字符
当使用ffmpeg-python读取视频时,如果视频元数据包含“旋转”属性,似乎默认情况下ffmpeg会根据旋转值转置传入的字节。
我想取消自动旋转。我尝试了以下,但没有成功:
import ffmpeg
process = (
ffmpeg
.input(filename)
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=0, vsync='0')
.global_args('-noautorotate')
.run_async(pipe_stdout=True)
)
代码运行没有任何问题,但旋转没有被忽略,正如我预期的那样。
据此:https://gist.github.com/vxhviet/5faf792f9440e0511547d20d17208a76,noautorotate 参数应在输入前传递。
我尝试了以下方法:
process = (
ffmpeg
.global_args('-noautorotate')
.input(filename)
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=0, vsync='0')
.run_async(pipe_stdout=True)
)
同样没有成功:
AttributeError: module 'ffmpeg' has no attribute 'global_args'
有什么建议吗?
编辑
将 noautorotate 作为 kwargs 传递也不起作用(阅读后的视频大小为 0)
process = (
ffmpeg
.input(self.file, **{'noautorotate':''})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=1, vsync='0')
.run_async(pipe_stdout=True)
)
将 **{'noautorotate':''}
替换为 **{'noautorotate':None}
。
正确的语法:
process = (
ffmpeg
.input(self.file, **{'noautorotate':None})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', loglevel=1, vsync='0')
.run_async(pipe_stdout=True)
)
使用**{'noautorotate':''}
时,FFmpeg输出错误:
Option noautorotate (automatically insert correct rotate filters) cannot be applied to output url -- you are trying to apply an input option to an output file or vice versa. Move this option before the file it belongs to.
Error parsing options for output file .
Error opening output files: Invalid argument
为了测试,我们可以添加 .global_args('-report')
,并查看日志文件。
正在执行以下命令:
process = (
ffmpeg
.input('input.mkv', **{'noautorotate':None})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', vsync='0')
.global_args('-report')
.run_async()
.wait()
)
日志文件显示了内置的 FFmpeg 命令行 - 看起来正确:
ffmpeg -noautorotate -i input.mkv -f rawvideo -pix_fmt yuv420p -vsync 0 pipe: -report
正在执行以下命令:
process = (
ffmpeg
.input('input.mkv', **{'noautorotate':''})
.output('pipe:', format='rawvideo', pix_fmt='yuv420p', vsync='0')
.global_args('-report')
.run_async()
.wait()
)
日志文件显示了以下内置的 FFmpeg 命令行:
ffmpeg -noautorotate -i input.mkv -f rawvideo -pix_fmt yuv420p -vsync 0 pipe: -report
在 -i
之前只有一个额外的 space,但出于某种原因 FFmpeg 将其解释为 URL(我认为这可能是与 Unicode 相关的问题 - 空字符串被解释为不是 space).