Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用 mp4clip 的 API clip.tick(0) 获取第0s画面和本地播放器第0s画面不一致 #348

Open
gubeils opened this issue Dec 17, 2024 · 4 comments
Labels
bug Something isn't working

Comments

@gubeils
Copy link

gubeils commented Dec 17, 2024

描述问题

我用下面提到的这段代码来切割视频,使用了‘-c copy’参数,目的是为了加快切割视频的速度。

但现在遇到一个问题,比如视频时长为7s,我从视频第3s开始截取,截取4s时长,

将上面切割后的结果视频,通过fetch方式获取后,MP4Clip 的api mp4Clip.tick(0)得到的视频帧是从原视频的第0秒开始播放的,但应该是要从原视频的第3s开始播放才对。

我也用本地播放器试了下,视频就是从原视频第3s开始播放,是对的。

复现步骤

const ffmpeg = require('fluent-ffmpeg');
function cutVideo(inputPath, outputPath, startTime, duration) {
return new Promise((resolve, reject) => {

ffmpeg(inputPath)
.setStartTime(startTime) // 设置开始时间
.setDuration(duration) // 设置持续时间
.outputOptions('-c copy') // 使用流复制,避免重新编码,保持视频质量和速度
.on('start', (command) => {
console.log('cutVideo.command:', command);
})
.on('error', (err) => {
console.error('cutVideo.发生错误:', err.message);
reject(err);
})
.on('end', () => {
console.log('cutVideo.裁剪完成:', outputPath);
resolve();
})
.save(outputPath); // 保存输出文件
});
}

const startTime = 3;
const duration = 4;
const inputPath = "./test.mp4"
const outputPath = `./output.mp4`;
await cutVideo(inputPath, outputPath, startTime, duration);

重现问题的步骤:

  1. 使用下面zip的素材视频,用上面提到的代码片段来裁切视频,
  2. 使用webav视频剪辑demo添加裁切后的视频文件,播放该视频,即可复现。(https://bilibili.github.io/WebAV/demo/6_4-video-editor)
  3. 在下面这个网站打开裁切后视频是从0s开始播放的https://www.onlinemp4parser.com/

期望行为

使用mp4clip,可以拿到切割后的结果视频的第一帧(对应原视频的第3s的画面)。
在我们的场景里,使用‘-c copy’参数必须保留(目的是为了加快切割视频的速度)。

视频文件[可选]
test.zip

环境信息

  • 操作系统/浏览器版本: 版本 131.0.6778.140(正式版本) (64 位)
  • @Webav 版本: "@webav/av-cliper": "1.0.6",
@gubeils gubeils added the bug Something isn't working label Dec 17, 2024
@hughfenghen
Copy link
Member

image
ffmpeg -c copy 不会重编码视频,它将剪辑信息存储在 edts box 中;

而 MP4Clip 不会处理 edts box,也暂无计划去解析它。
因为MP4 格式非常复杂,如果要完全支持,MP4Clip 将会非常复杂,类似视频播放器。

不过 MP4Clip 可以考虑抛出 moov box 的原始数据,供调用者支持自己的特殊场景?

@gubeils
Copy link
Author

gubeils commented Dec 17, 2024

@hughfenghen
好的大佬
在下面这个网站打开裁切后视频是从0s开始播放的https://www.onlinemp4parser.com,

@gubeils
Copy link
Author

gubeils commented Dec 17, 2024

image ffmpeg -c copy 不会重编码视频,它将剪辑信息存储在 edts box 中;

而 MP4Clip 不会处理 edts box,也暂无计划去解析它。 因为MP4 格式非常复杂,如果要完全支持,MP4Clip 将会非常复杂,类似视频播放器。

不过 MP4Clip 可以考虑抛出 moov box 的原始数据,供调用者支持自己的特殊场景?

大佬,不需要全部解析,是否可以将这个开始时长偏移量返回呢?原始数据如果也能一并返回的话会很好。

@gubeils
Copy link
Author

gubeils commented Dec 17, 2024

image ffmpeg -c copy 不会重编码视频,它将剪辑信息存储在 edts box 中;
而 MP4Clip 不会处理 edts box,也暂无计划去解析它。 因为MP4 格式非常复杂,如果要完全支持,MP4Clip 将会非常复杂,类似视频播放器。
不过 MP4Clip 可以考虑抛出 moov box 的原始数据,供调用者支持自己的特殊场景?

大佬,不需要全部解析,是否可以将这个裁切偏移量返回呢?原始数据如果也能一并返回的话会很好。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants