我正在使用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
新文件不好。他持续一秒钟,他的体型非常小。
有什么想法吗?
我想在我的服务器中使用它作为脚本,因此覆盖对我来说是最方便的方式,我更喜欢这种方式,而不是创建临时文件,然后用原始文件替换临时文件。
答案 0 :(得分:9)
我有同样的(令人沮丧的)问题,你可能已经注意到这发生了,因为ffmpeg正在写入它正在读取的文件,你在进程完成之前就破坏了源代码... ffmpeg没有&#39 ; t将文件放在某个缓冲区中,这样你就不能这样做了,你必须使用一个临时文件。
答案 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" .;
这有什么不好的东西吗?