
ffmpeg提取通义万象视频第一帧的时候一直出现超时的问题然后我去网上遍寻答案首先是有说AI生成的视频的编码格式与我们一般标准格式的视频不一致会把原数据从头部移至尾部为此写了一个这样的方法以此来把尾部的元数据提取至头部。private File standardizeVideo(File originalVideo) { try { File tempVideo File.createTempFile(standard_, .mp4); // 只修复封装不转码速度极快 ProcessBuilder pb new ProcessBuilder( ffmpeg, -y, -i, originalVideo.getAbsolutePath(), -c:v, copy, -c:a, copy, -movflags, faststart, // 把 moov 移到开头 tempVideo.getAbsolutePath() ); Process process pb.start(); process.waitFor(5, TimeUnit.SECONDS); return tempVideo; } catch (Exception e) { log.error(视频标准化失败, e); return null; } }但是依旧没有解决超时的问题而后又使用ffmpeg的强制提取第一帧命令行ProcessBuilder pb new ProcessBuilder( ffmpeg, -y, -probesize, 50M, // 扩大探测大小修复万象视频 -analyzeduration, 100M,// 延长分析时间修复万象视频 -i, videoFile.getAbsolutePath(), -ss, 00:00:00.500, -vf, scaleiw:ih, // 强制渲染一帧 -vframes, 1, -q:v, 2, coverFile.getAbsolutePath() );但是依旧没有解决。最后发现其实是缓存区满了导致子进程挂起所以应该启动单独线程消费 ffmpeg 的输出流new Thread(() - { try (BufferedReader reader new BufferedReader( new InputStreamReader(process.getInputStream()))) { String line; while ((line reader.readLine()) ! null) { // 丢弃输出防止缓冲区满 } } catch (Exception e) { // 忽略 } }).start();使用这个代码来做到丢弃输出防止缓冲区爆满的效果。最后ffmpeg可以正常提取视频第一帧。