&1 | gr-6ren">
gpt4 book ai didi

ffmpeg - 有没有一种优雅的方法使用 ffmpeg 按章节分割文件?

转载 作者:行者123 更新时间:2023-12-03 01:15:24 29 4
gpt4 key购买 nike

this page , Albert Armea 分享了一个使用 ffmpeg 按章节分割视频的代码。代码很简单,但不太好看。

ffmpeg -i "$SOURCE.$EXT" 2>&1 |
grep Chapter |
sed -E "s/ *Chapter #([0-9]+\.[0-9]+): start ([0-9]+\.[0-9]+), end ([0-9]+\.[0-9]+)/-i \"$SOURCE.$EXT\" -vcodec copy -acodec copy -ss \2 -to \3 \"$SOURCE-\1.$EXT\"/" |
xargs -n 11 ffmpeg

有没有一种优雅的方式来完成这项工作?

最佳答案

(编辑:此提示来自 https://github.com/phiresky 通过此问题:https://github.com/harryjackson/ffmpeg_split/issues/2 )

您可以使用以下方式获取章节:

ffprobe -i fname -print_format json -show_chapters -loglevel error

如果我再写一次,我会使用 ffprobe 的 json 选项

(原始答案如下)

这是一个有效的 python 脚本。我在几个视频上进行了测试,效果很好。 Python 不是我的第一语言,但我注意到你使用它,所以我认为用 Python 编写它可能更有意义。我已将其添加到 Github 。如果您想改进,请提交拉取请求。

#!/usr/bin/env python
import os
import re
import subprocess as sp
from subprocess import *
from optparse import OptionParser

def parseChapters(filename):
chapters = []
command = [ "ffmpeg", '-i', filename]
output = ""
try:
# ffmpeg requires an output file and so it errors
# when it does not get one so we need to capture stderr,
# not stdout.
output = sp.check_output(command, stderr=sp.STDOUT, universal_newlines=True)
except CalledProcessError, e:
output = e.output

for line in iter(output.splitlines()):
m = re.match(r".*Chapter #(\d+:\d+): start (\d+\.\d+), end (\d+\.\d+).*", line)
num = 0
if m != None:
chapters.append({ "name": m.group(1), "start": m.group(2), "end": m.group(3)})
num += 1
return chapters

def getChapters():
parser = OptionParser(usage="usage: %prog [options] filename", version="%prog 1.0")
parser.add_option("-f", "--file",dest="infile", help="Input File", metavar="FILE")
(options, args) = parser.parse_args()
if not options.infile:
parser.error('Filename required')
chapters = parseChapters(options.infile)
fbase, fext = os.path.splitext(options.infile)
for chap in chapters:
print "start:" + chap['start']
chap['outfile'] = fbase + "-ch-"+ chap['name'] + fext
chap['origfile'] = options.infile
print chap['outfile']
return chapters

def convertChapters(chapters):
for chap in chapters:
print "start:" + chap['start']
print chap
command = [
"ffmpeg", '-i', chap['origfile'],
'-vcodec', 'copy',
'-acodec', 'copy',
'-ss', chap['start'],
'-to', chap['end'],
chap['outfile']]
output = ""
try:
# ffmpeg requires an output file and so it errors
# when it does not get one
output = sp.check_output(command, stderr=sp.STDOUT, universal_newlines=True)
except CalledProcessError, e:
output = e.output
raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))

if __name__ == '__main__':
chapters = getChapters()
convertChapters(chapters)

关于ffmpeg - 有没有一种优雅的方法使用 ffmpeg 按章节分割文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30305953/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com