1 回答
TA贡献1835条经验 获得超7个赞
PyMuPDF 的下一版本将支持提取音频注释。使用此脚本使用 PyMuPDF 从 PDF 中提取音频注释,它很容易使用,只需调用该脚本并将 PDF 文件作为第一个参数传递即可:python script.py myfile.pdf
注意:仅适用于 Windows。
import fitz, sys, os, subprocess
assert len(sys.argv) == 2, "need filename as parameter"
ifile = sys.argv[1]
doc = fitz.open(ifile)
ofolder = os.path.dirname(ifile)
if ofolder == "":
ofolder = os.getcwd()
flnm = os.path.splitext(os.path.basename(ifile))[0]
defolder = ofolder + "\\" + flnm
os.mkdir(defolder)
defolder = defolder + "\\" + flnm
for page in doc:
print(page)
annotNumber = 1
for annot in page.annots(types=[fitz.PDF_ANNOT_SOUND]):
try:
sound = annot.soundGet()
except Exception as e:
print(e)
continue
for k, v in sound.items():
print(k, "=", v if k != "stream" else len(v))
ofile = defolder + ".page." + str(page.number) + ".annot." + str(annotNumber) + ".raw"
fout = open(ofile,"wb")
fout.write(sound["stream"])
fout.close()
ofileffmpeg = defolder + ".page." + str(page.number) + ".annot." + str(annotNumber) + ".mp3"
annotNumber += 1
if "channels" in sound:
channels = str(sound["channels"])
else:
channels = "1"
if "encoding" in sound:
if sound["encoding"] == "Signed":
encoding = "s"
else:
encoding = "u"
else:
encoding = "u"
if "bps" in sound:
fmt = encoding + str(sound["bps"]) + "be"
else:
fmt = encoding + "8"
subprocess.call(['ffmpeg', '-hide_banner', '-f', fmt, '-ar', str(sound["rate"]), '-ac', channels, '-i', str(ofile), str(ofileffmpeg)], shell=True)
添加回答
举报