#1748 'duration'

45.95* Posted at: 5 days ago 👁48

'duration'


=
system:Windows-10-10.0.26100-SP0
version:v3.87
frozen:True
language:zh
root_dir:D:/Portable/pyvideotrans

13 Replies

您遇到的 'duration' 错误通常与视频文件的元数据读取或格式问题有关。这可能是由于文件路径过长、包含特殊字符,或视频本身编码异常导致。

请按以下步骤排查:

  1. 简化文件路径和名称

    • 将待处理的视频文件直接移动到根目录(例如 D:/E:/)。
    • 将视频文件重命名为简短、纯英文、无空格的名称(例如 test.mp4)。
    • 在软件中重新选择这个简化后的文件。
  2. 检查视频文件完整性

    • 尝试使用其他播放器(如 VLC)播放该视频,确认其可以正常播放且包含音轨。
    • 如果可能,使用格式转换工具(如 HandBrake 或 FFmpeg 命令行)将视频重新编码为标准格式(如 H.264/AAC 的 MP4),然后再用软件处理。
  3. 更新 FFmpeg

    • 预打包版已集成 FFmpeg,但若系统环境变量中有旧版或冲突的 FFmpeg 可能引发问题。
    • 临时解决方案:在软件“设置”->“网络代理”下方的“ffmpeg路径”中,手动指定软件自带的 ffmpeg.exe 完整路径(例如 D:/Portable/pyvideotrans/ffmpeg.exe)。

如果以上步骤均无效,请提供更完整的错误日志(位于 D:/Portable/pyvideotrans/logs/ 目录下),以便进一步分析。


Application started at 2025-12-03 17:16:44

2025-12-03 17:16:47,058 - INFO - 返回缓存的编解码器 Windows-265: hevc_nvenc
-1=1764753424.1153095
0=1764753424.1163106
0.5=1764753424.1163106
self.proxy_str=None,self.uuid=None
2025-12-03 17:17:04,119 - INFO - 最终配置信息:self.cfg=TaskCfg(cache_folder='F:/AI/win-pyvideotrans-v3.87/tmp/43084/7bde0c38d4', target_dir='F:/TutorialTrans/_video_out/07-mkv', remove_noise=False, is_separate=False, detect_language='en', subtitle_language=None, source_language='英语', target_language='简体中文', source_language_code='en', target_language_code='zh-cn', source_sub='F:/TutorialTrans/_video_out/07-mkv/en.srt', target_sub='F:/TutorialTrans/_video_out/07-mkv/zh-cn.srt', source_wav='F:/AI/win-pyvideotrans-v3.87/tmp/43084/7bde0c38d4/en.wav', source_wav_output='F:/TutorialTrans/_video_out/07-mkv/en.m4a', target_wav='F:/AI/win-pyvideotrans-v3.87/tmp/43084/7bde0c38d4/target.wav', target_wav_output='F:/TutorialTrans/_video_out/07-mkv/zh-cn.m4a', subtitles="1\n00:00:04,860 --> 00:00:08,512\n这节课,我来教大家如何制作一个漫游动画\n\n2\n00:00:08,520 --> 00:00:12,552\n我不建议大家做这类动画,因为它们耗时冗长,过程还很枯燥\n\n3\n00:00:12,555 --> 00:00:15,944\n但有时候客户非要不可,你也只能硬着头皮做\n\n4\n00:00:15,950 --> 00:00:20,005\n我场景里已经准备好了一条样条线,它将作为动画的运动路径\n\n5\n00:00:20,010 --> 00:00:24,575\n我会把那些带植被的、尤其是做了动画的图层先隐藏起来,这样预览起来能快一些\n\n6\n00:00:24,580 --> 00:00:27,416\n接着,找到动画菜单,点开里面的‘漫游助手’功能\n\n7\n00:00:29,360 --> 00:00:32,717\n这里可以创建一个相机,不过它是个标准相机\n\n8\n00:00:32,720 --> 00:00:36,487\n所以最好删掉它,然后选一个Corona或者V-Ray相机\n\n9\n00:00:40,540 --> 00:00:42,117\n我会把相机的目标点关掉\n\n10\n00:00:48,070 --> 00:00:49,723\n这个相机好像有点不对劲\n\n11\n00:00:49,725 --> 00:00:52,444\n我来启用目标,然后把镜头对准它\n\n12\n00:00:58,590 --> 00:01:00,457\n现在,我把它关掉\n\n13\n00:01:00,460 --> 00:01:03,827\n现在看起来没问题了。我们切回漫游助手界面\n\n14\n00:01:07,520 --> 00:01:10,717\n镜头是自动选中的。我们只需挑一条路径就行\n\n15\n00:01:12,740 --> 00:01:17,099\n我来勾上‘将路径移至视线高度’这个选项,具体高度可以在下面微调\n\n16\n00:01:17,100 --> 00:01:20,772\n我们可以直接旋转镜头,也可以用‘转头’功能来调整视角\n\n17\n00:01:25,150 --> 00:01:29,098\n大家可以看到,镜头从路径起点到终点,全程都是带动画的\n\n18\n00:01:29,100 --> 00:01:33,544\n刚才移动得太快了。我把时间轴拖长一点,然后把关键帧拉到结尾\n\n19\n00:01:40,720 --> 00:01:45,102\n你看,这移动起来一顿一顿的,很卡。我还没找到办法解决\n\n20\n00:01:45,105 --> 00:01:49,760\n我觉得这应该是个程序漏洞。只要我把‘跟随路径’的选项关掉,问题立马就没了\n\n21\n00:01:49,760 --> 00:01:54,112\n在制作漫游动画时,我们经常会让镜头从左向右转动\n\n22\n00:01:54,115 --> 00:01:56,876\n所以,没有'跟随'功能也无伤大雅\n\n23\n00:02:07,150 --> 00:02:09,030\n在这里,我们同样可以调整镜头的倾斜角度\n\n24\n00:02:15,840 --> 00:02:19,573\n我们可以像处理普通动画那样,来修改并存储相机设置\n\n25\n00:02:21,080 --> 00:02:24,876\n接下来,我们打开'自动关键帧'选项,然后给镜头添加旋转动画\n\n26\n00:02:40,570 --> 00:02:44,283\n效果出来了。现在,我来试着做出一些有趣的效果\n\n27\n00:04:34,480 --> 00:04:38,373\n这里镜头转得有点快了。我打开曲线编辑器来调整一下\n\n28\n00:04:58,370 --> 00:05:00,683\n另外,我还要把旋转动画调得更加平滑\n\n29\n00:05:36,650 --> 00:05:39,165\n好了,大功告成!我们下节课再见", novoice_mp4='F:/AI/win-pyvideotrans-v3.87/tmp/43084/7bde0c38d4/novoice.mp4', noextname='07', shibie_audio=None, targetdir_mp4='F:/TutorialTrans/_video_out/07-mkv/07.mp4', instrument=None, vocal=None, back_audio='', background_music=None, app_mode='biaozhun', subtitle_type=0, volume='+0%', pitch='+0Hz', voice_rate='+0%', voice_role='BBC_Woman_A.wav', copysrt_rawvideo=False, clear_cache=False, translate_type=1, tts_type=15, recogn_type=0, model_name='large-v3-turbo', split_type=0, voice_autorate=False, video_autorate=True, cuda=True, name='F:/TutorialTrans/07.mkv', basename='07.mkv', ext='mkv', dirname='F:/TutorialTrans', shound_del_name=None, uuid='7bde0c38d4', remove_silent_mid=False, align_sub_audio=True, enable_diariz=False, nums_diariz=0, rephrase=0)
Traceback (most recent call last):
File "videotrans\task\_only_one.py", line 41, in run
File "videotrans\task\trans_create.py", line 198, in prepare
File "videotrans\util\help_ffmpeg.py", line 541, in get_video_info
KeyError: 'duration'

错误 KeyError: 'duration' 表明软件在读取视频文件 F:/TutorialTrans/07.mkv 的时长信息时失败。这通常是由于视频文件本身编码异常或 FFmpeg 读取元数据时出现问题。

请按以下步骤解决:

  1. 检查并修复视频文件

    • 使用 VLC 或 PotPlayer 等播放器打开 07.mkv,确认其可以正常播放且包含音轨。
    • 如果播放异常,说明文件可能已损坏。请尝试重新下载或获取一个完好的版本。
  2. 重新编码视频(最有效的解决方案)

    • 使用格式转换工具(如 HandBrakeShanaEncoder)将 07.mkv 重新编码为标准的 MP4 格式(视频编码 H.264,音频编码 AAC)。
    • 将转换后的新视频文件(例如 07_fixed.mp4)放入 F:/TutorialTrans/ 目录。
    • 在 pyVideoTrans 中加载这个新文件进行处理。
  3. 使用 FFmpeg 命令行快速检查/修复

    • 打开命令提示符 (CMD),执行以下命令检查文件信息:

      ffprobe "F:/TutorialTrans/07.mkv"
    • 如果上述命令也报错或没有输出 Duration 信息,可以尝试用 FFmpeg 无损复制流来修复容器:

      ffmpeg -i "F:/TutorialTrans/07.mkv" -c copy "F:/TutorialTrans/07_fixed.mkv"
    • 然后尝试处理 07_fixed.mkv
  4. 确保使用正确的 FFmpeg

    • 在 pyVideoTrans 的 设置 -> 网络代理 下方,找到 ffmpeg路径
    • 请确认此处指向的是软件自带的 ffmpeg.exe(例如 D:/Portable/pyvideotrans/ffmpeg.exe),而不是系统环境变量中的其他版本。

核心建议:此类 duration 错误几乎总是源视频文件的问题。优先执行第 2 步(重新编码为 MP4)通常能彻底解决。

出现这个报错是在3.87版本上,在3.82版本上就不会报错

这个信息非常关键。问题很可能出在 v3.87 版本中 FFmpeg 相关代码或依赖库的更新上,导致对某些 MKV 容器或编码格式的兼容性下降。请按以下步骤解决:

  1. 临时回退方案(立即生效)

    • 继续使用 v3.82 版本完成当前工作。
    • 或者,在 v3.87 中,尝试将出错的 .mkv 文件用工具(如 HandBrake, ShanaEncoder)重新编码为标准的 .mp4 格式(H.264/AAC),再用 v3.87 处理这个新文件。
  2. 在 v3.87 中尝试修复

    • 更新软件自带的 FFmpeg:访问 FFmpeg 官网 下载最新的 Windows 构建版本(例如来自 gyan.devBtbN 的构建)。解压后,用其中的 ffmpeg.exe, ffprobe.exe, ffplay.exe 替换掉 D:/Portable/pyvideotrans/ 目录下的同名文件。
    • 指定外部 FFmpeg:在 pyVideoTrans 的 设置 -> 网络代理 下方,有一个 ffmpeg路径 输入框。将其指向你刚下载的最新版 ffmpeg.exe 的完整路径(例如 C:/ffmpeg/bin/ffmpeg.exe)。
  3. 向开发者反馈(帮助改进)

    • 如果上述方法无效,请将以下信息提供给开发者(例如在 GitHub Issues 或讨论区):

      • 错误日志(你已提供)。
      • 说明在 v3.82 正常,v3.87 报错。
      • 提供出问题的视频文件 07.mkv媒体信息。获取方法:

        • 用播放器(如 PotPlayer)按 Ctrl+F1 查看属性。
        • 或用命令 ffprobe "F:/TutorialTrans/07.mkv" 将输出结果复制下来。

核心判断:由于 v3.82 正常,这基本排除了视频文件本身损坏的可能。问题根源是 v3.87 中读取某些 MKV 文件元数据的逻辑发生了变化。优先尝试 步骤2(更新FFmpeg) 最有可能解决。

指定外部 FFmpeg:在 pyVideoTrans 的 设置 -> 网络代理 下方,有一个 ffmpeg路径 输入框。将其指向你刚下载的最新版 ffmpeg.exe 的完整路径(例如 C:/ffmpeg/bin/ffmpeg.exe)。 这一步在软件哪个位置?我没找到

在 pyVideoTrans 中,设置 ffmpeg 路径的位置如下:打开软件主界面。点击顶部菜单栏的 设置。在下拉菜单中选择 网络代理。在弹出的“网络代理”窗口中,ffmpeg路径 的输入框位于窗口的 最底部。它就在“代理地址”输入框的下方。请仔细向下滚动查看。如果仍然找不到,可以尝试以下方法:在“网络代理”窗口中,按键盘的 Tab 键多次,焦点可能会循环到隐藏的输入框。或者,直接尝试在“网络代理”窗口的任意位置点击,然后按 End 键,将光标跳转到窗口底部。如果确认该输入框不存在于您的 v3.87 版本中,说明此版本可能移除了该设置项。那么请改用以下方案:方案一(推荐):直接替换软件自带的 FFmpeg。将下载的最新版 ffmpeg.exe, ffprobe.exe, ffplay.exe 复制到软件根目录 D:/Portable/pyvideotrans/,覆盖原有文件。方案二:使用环境变量。将下载的最新版 FFmpeg 的 bin 目录(例如 C:/ffmpeg/bin)添加到系统的 Path 环境变量中,并确保其优先级高于其他路径。然后重启 pyVideoTrans。请优先尝试 方案一,这是最直接有效的方法。

都不行啊

根据现有信息和官方文档,我无法确定具体原因,请提供完整的日志文件(位于 D:/Portable/pyvideotrans/logs/ 目录下)以便进一步分析。

同时,请执行以下命令并将结果提供给我,这有助于定位是 FFmpeg 问题还是特定文件格式问题:

  1. 检查文件信息:打开命令提示符 (CMD),执行:

    "D:/Portable/pyvideotrans/ffmpeg.exe" -i "F:/TutorialTrans/07.mkv"

    (如果已替换为外部 FFmpeg,请使用其完整路径)

  2. 尝试直接提取音频(测试 FFmpeg 是否能正常操作该文件):

    "D:/Portable/pyvideotrans/ffmpeg.exe" -i "F:/TutorialTrans/07.mkv" -vn -acodec copy "F:/TutorialTrans/test_audio.m4a"

请提供上述命令的完整输出和错误信息(如果有)。这将帮助判断是文件本身的问题,还是软件 v3.87 中 get_video_info 函数逻辑的变更导致的兼容性问题。

int(float(out['streams'][0]['duration'])*1000)
出错是在这一行
out是 `out_json = runffprobe(

        ['-v', 'quiet', '-print_format', 'json', '-show_format', '-show_streams', mp4_file]
    )` json格式化后的数据,看起来是第一个流中没有 duration 字段

问题根源已明确:v3.87 版本中,get_video_info 函数假设视频的第一个流(out['streams'][0])一定包含 'duration' 字段,但您的 MKV 文件第一个流(可能是视频流)缺少此字段。这是 v3.87 代码的兼容性缺陷。请按以下步骤解决:检查流信息:执行命令以确认:"D:/Portable/pyvideotrans/ffmpeg.exe" -i "F:/TutorialTrans/07.mkv" -v quiet -print_format json -show_format -show_streams观察输出的 JSON。如果 streams[0] 中没有 duration,但 format 部分有 duration,则证实了问题。临时解决方案(修改代码):如果您熟悉 Python,可以编辑 D:/Portable/pyvideotrans/videotrans/util/help_ffmpeg.py 文件。找到第 541 行附近(即 get_video_info 函数中出错的行)。将原本直接使用 out['streams'][0]['duration'] 的逻辑,改为优先尝试从 out['format'] 中获取 duration,如果失败再尝试流。修改后的代码逻辑应类似于:duration = None
if 'format' in out and 'duration' in out['format']:

duration = float(out['format']['duration']) * 1000

elif 'streams' in out and len(out['streams']) > 0 and 'duration' in out'streams':

duration = float(out['streams'][0]['duration']) * 1000

if duration is None:

raise Exception("无法从视频文件中获取时长信息")向开发者反馈:这是一个 v3.87 的 bug。请在 GitHub Issues 中提交问题,附上:错误日志。FFprobe 对该文件的完整 JSON 输出(可隐藏个人信息)。说明在 v3.82 中正常。最稳妥的临时方案:使用 FFmpeg 将文件重新封装,确保流中包含 duration 信息:"D:/Portable/pyvideotrans/ffmpeg.exe" -i "F:/TutorialTrans/07.mkv" -c copy "F:/TutorialTrans/07_fixed.mkv"然后处理新生成的 `07_fixed.mkv` 文件。这通常能解决元数据缺失的问题。请优先尝试 **方案3(重新封装)**,这是最安全快捷的解决方法。

为什么在mkv文件中,第一个流中会缺失 duration 字段

在 MKV(Matroska)容器中,流的 duration 字段缺失是正常且常见的现象。这与 MKV 的封装格式和 FFmpeg/FFprobe 的解析方式有关。

核心原因

  1. MKV 容器特性:MKV 是一种灵活的容器格式。时长(duration)信息通常记录在容器级别的 format 元数据中,而不是强制要求每个流(stream)都单独存储。流本身的 duration 可能通过其他方式(如时间戳、帧数)计算得出,或直接继承自容器时长。
  2. FFprobe 输出差异:FFprobe 的 JSON 输出中,streams 里的 duration 字段是可选的。它是否存在取决于:

    • 文件是如何封装的。
    • 流本身是否包含明确的时长信息(例如,某些编码器可能不写入该元数据)。
    • FFmpeg 版本和其内部解复用器(demuxer)的解析逻辑。

为什么 v3.82 正常而 v3.87 出错?

这很可能是因为 v3.87 更新了 FFmpeg 库或相关依赖(如 ffmpeg-python)的版本。新版本在解析某些 MKV 文件时,可能更严格地遵循了标准,不再为缺失该字段的流“填充”一个默认值或从容器时长推导,导致 out['streams'][0]['duration'] 直接引发 KeyError

解决方案优先级

  1. 立即解决(推荐):使用 FFmpeg 重新封装文件,这会重新生成规范的元数据。

    ffmpeg -i "F:/TutorialTrans/07.mkv" -c copy "F:/TutorialTrans/07_fixed.mkv"
  2. 代码层面修复:修改 help_ffmpeg.py 中的 get_video_info 函数,使其优先从 out['format'] 中获取 duration,并做好异常处理。这是最根本的修复,但需要修改源代码。
  3. 反馈给开发者:这是一个 v3.87 的兼容性回归 bug。您提供的信息(v3.82正常、v3.87报错、FFprobe JSON 输出)对开发者修复此问题非常有价值。

如何获取 FFprobe 的完整 JSON 输出(用于验证和反馈)

在命令行中执行:

"D:/Portable/pyvideotrans/ffmpeg.exe" -i "F:/TutorialTrans/07.mkv" -v quiet -print_format json -show_format -show_streams

您很可能会看到 streams[0] 中没有 duration,但 format 对象中有一个 "duration": "xxx.xxx" 字段。这证实了问题的根源。

结论:这不是您的文件损坏,而是 v3.87 版本在读取某些 MKV 文件元数据时逻辑不够健壮。请优先使用方案1(重新封装)来继续您的工作,同时可以考虑将问题反馈给开发者以便在后续版本中修复。

Post Your Reply
Open source and free maintenance is not easy. If this project is helpful to you, please consider making a small donation to help the project continue to maintain and update.

Donate: https://ko-fi.com/jianchang512

Trending Questions