使用ffmpeg进行转换时覆盖文件的问题

时间:2015-03-05 11:39:51

标签: ffmpeg

我正在使用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

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

有什么想法吗?

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

4 个答案:

答案 0 :(得分:9)

我有同样的(令人沮丧的)问题,你可能已经注意到这发生了,因为ffmpeg正在写入它正在读取的文件,你在进程完成之前就破坏了源代码... ffmpeg没有&#39 ; t将文件放在某个缓冲区中,这样你就不能这样做了,你必须使用一个临时文件。

just in case

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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

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

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

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

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

答案 3 :(得分:-1)

使用tmp文件都不是太烦人。一行:

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

这有什么不好的东西吗?