使用 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).

的字符