有没有一种方法可以暂停和恢复FFmpeg编码?


14

我每天录制几个小时的视频素材,并将其设置在队列中以使用进行编码ffmpeg。我将veryslow预设与配合使用x265,因此一小时的视频可能最多需要20个小时或更长时间来编码。

由于我的计算机白天和黑夜都在工作,我想知道是否ffmpeg可以暂停和恢复编码?我正在使用TerminalOSX。

如果是这样,即使关闭终端并重新启动计算机后,我也可以继续编码吗?我认为,当您再次登录OS X时,将恢复终端会话,至少终端历史是这样。

Answers:


14

暂停

一种简单的方法是使用ctrl+ 挂起它z。或者,您可以获取PID,pgrep ffmpeg然后将其kill -s SIGSTOP <PID>用于挂起。

然后使用fg命令或恢复kill -s SIGCONT <PID>

不幸的是,这在重启后将无法生存。

虚拟机

如果您使用带有VirtualBox之类的虚拟机,则可以在来宾VM中执行编码。它将使您可以随时“保存计算机状态”,这在重启后仍然有效。它还可以允许您为来宾分配最大CPU资源,这样您的主机将始终具有可用资源。

可能过大了,但是如果您熟悉VM或已经使用过VM,则可能是一种解决方案。


我喜欢那种VM解决方案,但是,除非您已经在使用它,否则这将是一个很大的麻烦。
user24601 '17

VirtualBox方式对我不起作用。尝试仅以中间编码形式保存状态,并尝试通过[Ctrl] + [z]暂停,然后保存状态。恢复状态并尝试恢复后,ffmpeg停止并显示错误(decode_band_types: Input buffer exhausted before END element foundInvalid NAL unit sizeError writing trailer/ Protocol error)。我不知道这可能与时间的推移有关。
贾尼斯·埃默里斯(JānisElmeris)

@JānisElmeris我似乎无法复制该问题。我在Ubuntu 18.04 VM上进行了尝试,并且可以正常工作。
llogan

好吧,我可能还不够幸运。:)尝试使用新的Linux Mint 19.1(基于Ubuntu 18.04)VirtualBox VM。
贾尼斯·埃默里斯(JānisElmeris)

我的ffmpeg有很多烦恼和许多PID。我必须分别对它们进行SIGSTOP和SIGCONT吗?有没有及时的限制?
wuppi

11

在Windows上,按“暂停/中断”键(最右上角的键)将使其暂停。输入将继续。

如果不起作用,请在命令提示符窗口中单击以使其聚焦。


对于Windows(已在Windows 10上验证),这是最简单,最佳的答案。
lidsinker

1
这样可以完全释放CPU,但RAM仍然是瓶颈。就我而言,我有8gb的内存,并且在操作暂停时它几乎仍在使用它。有什么解决办法吗?我可以将其传输到硬盘吗?当我暂停时,我不介意事情进展。
放风筝

10

截至2015年9月30日,这似乎是不可能的。我建议对源文件进行分段,对分段进行编码,然后拼接结果文件。

这不是真正的暂停/恢复功能,但是零碎的划分将使您在编码方面有所突破。

发出命令的粗略概述:

将整个文件分成几部分

ffmpeg -i recording.mp4 -c copy -flags +global_header -segment_time n -f segment file%03d.mp4

这应该创建file000.mp4,file001.mp4,依此类推。由于分段器的工作方式-它仅在I帧处剪切-这些文件的n长度可能不会精确到几秒钟,视频部分可能无法正常播放,但是数据就在那里,您可以转换每个部分,例如

ffmpeg -i file001.mp4 -{filter/encoding parameters} -fflags +genpts file001-new.mp4

重新加入编码部分

创建一个文本文件,并像这样输入每个渲染文件的名称

file 'file000-new.mp4'
file 'file001-new.mp4'
.... 
file 'filelast-new.mp4'

然后跑

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4

我只有6GB的内存,从x264到x265大约需要12小时的时间,并且没有间断(桌面),我无法使用VM技巧,但这听起来很棒!我只是希望重新加入的步骤很快,但是由于上面没有编码,所以我认为会的。必须尝试一下,thx vm!
水瓶座力量

它在加入时会发出警告:“流0的编解码器不使用全局头,但是容器格式需要全局头”,但最终结果是可用的视频,我一点也没看到问题
Aquarius Power

4

我建议您不要暂停,而应将编码过程的系统优先级设置为最低(也称为“ renice ”),这样您就可以每天舒适地工作,并且编码将在后台使用未使用的系统资源进行。因此,您的编码将全天候24/7无缝进行,不会与日常工作发生冲突

由于AFAIK OSX缺少pidof命令,因此您需要知道ffmpeg进程号(PID)

那么你可以使用renice过程中闲置的背景

sudo renice 20 yourPID

如果需要的话,您还可以将流程重新安排为更具攻击性的前台优先级

sudo renice -10 yourPID

嗨!好建议。将不得不尝试。
Winterflags


1

(对于Linux)

众所周知,按“ q”将结束录制文件。

ffplay具有“ p”可能性。ffmpeg为什么没有相同的东西?也许是因为它可能导致视频和音频之间的不同步?

我只是使用crf(23)将ffmpeg编码为x264-aac-mkv,并且始终在相同的视频条件下,“退出”(q)录制并将所有片段加入此脚本所在的特定目录中的1个文件中使用以下bash脚本在流复制模式下:

#!/bin/bash

# FFMPEG MERGE

# File path must be absolutely absolute...

ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" /home/me/Videos/FFmpeg/FFmpeg_Merge/*.mkv) -c copy merged.mkv

exit 

之后,我检查生成的合并视频并将其粘贴到另一个目录。这些段将从合并目录中删除。

但是,确实欢迎使用无忧的“暂停和恢复”按钮;)


0

这只是个主意,但是如果您有足够的预算,最好将处理器(升级至第8代Intel)或更高的显卡(升级至NVIDIA GTX 1050或更高版本)升级,以便进行编码具有硬件加速功能而不是CPU密集型功能的h.265 / HEVC x265。您的视频编码将在不到20小时的时间内完成,从而也节省了电费。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.