2017-05-03 202 views
0

我正在从4K视频中提取和转码剪辑。 我已经知道从哪里开始以及剪辑应该持续多久。在管道中使用ffmpeg -sseof

我使用下面的命令来提取我需要夹子(30秒到视频,我需要10秒剪辑)
ffmpeg -ss 30 -i 'input.mp4' -c copy -t 10 -f matroska 'output.mp4'

为了使视频保留关键帧,所以它知道要画什么,剪辑可以超过10秒(这是预期的)

然后我可以使用以下代码对视频进行转码,并确保它只需要最后10秒(具体来说就是sseof命令)
ffmpeg -sseof -10 -i 'output.mp4' -vcodec libx264 -r 15 -s 720x400 -aspect 720:400 -sn -f matroska -acodec libmp3lame -ac 2 -ar 11025 -y 'transcoded.mkv'

由于缓慢的文件系统,我想避免将提取的剪辑写入磁盘的第一步,我可以使用管道执行此操作,并且只是在运行时进行转码。
ffmpeg -ss 30 -i 'input.mp4' -c copy -t 10 -f matroska pipe:1 | ffmpeg -i pipe:0 -vcodec libx264 -r 15 -s 720x400 -aspect 720:400 -sn -f matroska -acodec libmp3lame -ac 2 -ar 11025 -y 'transcoded.mkv'

然而,随着管我不能使用-sseof命令,因为它只是使一个无效的视频剪辑文件。 (没有来自日志的错误或警告)

我目前的解决方案是再次对转码后的视频片段进行转码,并且只花费最后10秒。 (但这似乎是一个糟糕的解决方法,而不是一个真正的解决方案)

由于这是我第一次使用ffmpeg,我想知道是否有可能通过管道拍摄视频的最后10秒?或者也许有人对此有更好的解决方案?

回答

0

也许我失去了一些东西,但你需要的是

ffmpeg -ss 30 -i 'input.mp4' -t 10 -vcodec libx264 -r 15 -s 720x400 -aspect 720:400 
     -acodec libmp3lame -ac 2 -ar 11025 -sn -f matroska -y 'transcoded.mkv' 
+0

出于某种原因,如果输入文件是'.mkv'或'.ts'文件,它实际上将转码的前30秒即使它设置为跳过它们。 (或者至少这是如果我检查CPU并查看其负载的情况)但是,如果该文件是“.mp4”,则它按预期工作。不幸的是我必须能够处理所有3种文件类型。 – Thrasd

+0

正如预期的那样在TS和MKV中工作。 – Mulvya

+0

如果我使用这个文件作为输入[4ksamples](http://4ksamples.com/elysium-2013-2160p-1-minute-sample-footage/),设置'-ss 0'大约需要8秒,而' SS 45'大概需要14秒(在我的机器上)。这是跳跃45秒的相当大的增加。我是否误解了某些东西,或者它是否会像这样工作? – Thrasd