无法覆盖 FFMPEG 的编码器标签
Unable to overwrite FFMPEG's encoder tag
我正在 python 中编写一个调用 ffmpeg 的小脚本,该脚本工作正常,但我无法阻止 FFMPEG 用它自己的 'Lavf58.29.100' 编码器覆盖编码器标签。
我尝试使用 FFPROBE 将输入属性捕获为变量并将源编码器显式写入编码器标签,但它仍然在输出文件上使用 'Lavf58.29.100' 进行转码。
import subprocess
file = 'File_in.wav'
attributes = subprocess.Popen(['ffprobe', file], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
for x in attributes.stdout.readlines():
x = x.decode(encoding='utf-8')
if 'Stream' in x:
bit_depth = x[24:33]
if 'encoder' in x:
encoder = x[22:-1]
subprocess.call(['ffmpeg', '-i', file, '-af', 'areverse', '-c:a', bit_depth, '-metadata:s:a', 'encoder=' + encoder, 'File_out.wav'])
这里是python之外的ffmpeg命令:
ffmpeg -i 'File_in.wav' -af areverse -c:a pcm_s24le -metadata:s:a encoder='WaveLab Pro 10.0.10' 'File_out.wav'
来自 MediaInfo:
源文件 - "Encoded_Application": "WaveLab Pro 10.0.10"
输出文件 - "Encoded_Application": "Lavf58.29.100"
维护文件来源非常重要,所以我不能更改源元数据。有谁知道解决这个问题的方法吗? FFMPEG 似乎接受其他属性但不接受编码器标签。
根据我的发现,此默认行为无法在 ffmpeg 中更改 - 唯一的解决方法是在 ffmpeg 完成处理后使用 BWF MetaEdit 重写输入编码器。
import os
import glob
import subprocess
dir = os.getcwd()
os.makedirs(f'{dir}/_reversed', exist_ok=True)
rev_out = dir + r'/_reversed'
get_files = glob.glob(dir + '/*.wav')
def reverse_file():
for i in get_files:
file = i
get_filename = os.path.splitext(str(i))[0]
filename_only = os.path.basename(get_filename)
attributes = subprocess.Popen(['ffprobe', file], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
for x in attributes.stdout.readlines():
x = x.decode(encoding='utf-8')
if 'encoder' in x:
encoder = x[22:-1]
if 'Stream' in x:
bit_depth = x[24:33]
subprocess.call(['ffmpeg', '-i', file, '-af', 'areverse', '-c:a', bit_depth, rev_out + '/' + filename_only + '.wav'])
subprocess.call(['bwfmetaedit', rev_out + '/' + filename_only + '.wav', '-a', '--ISFT=' + encoder])
reverse_file()
我正在 python 中编写一个调用 ffmpeg 的小脚本,该脚本工作正常,但我无法阻止 FFMPEG 用它自己的 'Lavf58.29.100' 编码器覆盖编码器标签。
我尝试使用 FFPROBE 将输入属性捕获为变量并将源编码器显式写入编码器标签,但它仍然在输出文件上使用 'Lavf58.29.100' 进行转码。
import subprocess
file = 'File_in.wav'
attributes = subprocess.Popen(['ffprobe', file], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
for x in attributes.stdout.readlines():
x = x.decode(encoding='utf-8')
if 'Stream' in x:
bit_depth = x[24:33]
if 'encoder' in x:
encoder = x[22:-1]
subprocess.call(['ffmpeg', '-i', file, '-af', 'areverse', '-c:a', bit_depth, '-metadata:s:a', 'encoder=' + encoder, 'File_out.wav'])
这里是python之外的ffmpeg命令:
ffmpeg -i 'File_in.wav' -af areverse -c:a pcm_s24le -metadata:s:a encoder='WaveLab Pro 10.0.10' 'File_out.wav'
来自 MediaInfo:
源文件 - "Encoded_Application": "WaveLab Pro 10.0.10"
输出文件 - "Encoded_Application": "Lavf58.29.100"
维护文件来源非常重要,所以我不能更改源元数据。有谁知道解决这个问题的方法吗? FFMPEG 似乎接受其他属性但不接受编码器标签。
根据我的发现,此默认行为无法在 ffmpeg 中更改 - 唯一的解决方法是在 ffmpeg 完成处理后使用 BWF MetaEdit 重写输入编码器。
import os
import glob
import subprocess
dir = os.getcwd()
os.makedirs(f'{dir}/_reversed', exist_ok=True)
rev_out = dir + r'/_reversed'
get_files = glob.glob(dir + '/*.wav')
def reverse_file():
for i in get_files:
file = i
get_filename = os.path.splitext(str(i))[0]
filename_only = os.path.basename(get_filename)
attributes = subprocess.Popen(['ffprobe', file], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
for x in attributes.stdout.readlines():
x = x.decode(encoding='utf-8')
if 'encoder' in x:
encoder = x[22:-1]
if 'Stream' in x:
bit_depth = x[24:33]
subprocess.call(['ffmpeg', '-i', file, '-af', 'areverse', '-c:a', bit_depth, rev_out + '/' + filename_only + '.wav'])
subprocess.call(['bwfmetaedit', rev_out + '/' + filename_only + '.wav', '-a', '--ISFT=' + encoder])
reverse_file()