【问题标题】:Issue with overwriting file while using ffmpeg for converting使用 ffmpeg 进行转换时覆盖文件的问题
【发布时间】:2015-05-06 18:35:58
【问题描述】:

我正在使用 ffpmeg 将我所有的视频转换为 mp4:

 ffmpeg -i InpuFile -vcodec h264 -acodec aac -strict -2 OutputFile.mp4

问题是,如果我覆盖输入文件,即输出和输入文件是相同的:

 ffmpeg -i InpuFile -vcodec h264 -acodec aac -strict -2 InpuFile.mp4 -y

 ffmpeg -i InpuFile -y -vcodec h264 -acodec aac -strict -2 InpuFile.mp4

新文件不好。他持续一秒钟,他的体型非常小。

有什么想法吗?

我想在我的服务器中使用它作为脚本,所以覆盖对我来说是最方便的方式,我更喜欢这种方式,而不是创建临时文件然后用原始文件替换临时文件。

【问题讨论】:

  • 同样的概念适用于大多数 linux 工具。克服它的唯一方法是使用 tmp 文件。如果工具可以选择克服它,那基本上就是它们在幕后所做的事情。

标签: ffmpeg


【解决方案1】:

我遇到了同样的(令人沮丧的)问题,您可能已经注意到这是因为 ffmpeg 正在覆盖它正在读取的文件,您在进程完成之前破坏了源... ffmpeg 没有将文件放入一些缓冲区,所以你不能这样做,你将不得不使用一个临时文件。

just in case

【讨论】:

  • 这是正确的。我正在使用 PHP shell_exec 来尝试压缩文件,但它会引发错误。您不能覆盖输入源。所以,是的,创建一个临时文件,然后重命名它。
【解决方案2】:

编码时不能覆盖输入文件。您必须编码为不同的输出文件。

之后,您可以将原始文件替换为新的编码文件。

【讨论】:

    【解决方案3】:

    正如其他人所提到的,如果不创建临时文件,就无法做到这一点。你提到你想压缩所有的视频,为了方便。这是我用来压缩目录中所有 MP4 和 MOV 的 bash 单行:

    find * -type f \( -iname \*.mp4 -o -iname \*.mov \) -execdir ffmpeg -i {} -vcodec libx265 -crf 24 temp_{} \; -execdir mv temp_{} {} \;
    
    

    -crf 参数控制视频比特率。取值范围为18-24,值越小码率越高。

    例如,如果您只想压缩 .mp4,那么您可以将命令更改为:

    find * -type f -iname "*.mp4" -execdir ffmpeg -i {} -vcodec libx265 -crf 24 temp_{} \; -execdir mv temp_{} {} \;
    

    希望这对 OP 或任何想做类似事情的人有所帮助。

    【讨论】:

      【解决方案4】:

      tmp 文件的使用也不会太烦人。一行:

      input="InpuFile"; ffmpeg -i "$input" -y -vcodec h264 -acodec aac -strict -2 "/tmp/$input";rm "$input"; mv "/tmp/$input" .;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 2013-05-20
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        相关资源
        最近更新 更多