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

生成的文件没有画面了 #3

Closed
Aric-Sun opened this issue Oct 7, 2020 · 2 comments
Closed

生成的文件没有画面了 #3

Aric-Sun opened this issue Oct 7, 2020 · 2 comments
Labels
bug Something isn't working

Comments

@Aric-Sun
Copy link
Owner

Aric-Sun commented Oct 7, 2020

用PotPlayer播放被识别成音频了。
文件:20201006-195721-又温又萌-751.flv。在readme中提供的网盘链接中查找。

@Aric-Sun Aric-Sun added the bug Something isn't working label Oct 7, 2020
@Aric-Sun
Copy link
Owner Author

Aric-Sun commented Oct 7, 2020

使用MPV可以看到画面,但时间帧直接定位到下一个关键帧了。用本项目所依赖的fib查看了一下,发现到下一个关键帧之前都是音频帧。重复使用本工具不会有效果,或者使用ffmpeg在关键帧处切割也一样,依然被PotPlayer识别为音频。

我查阅相关资料,找到的方法,要么根本不管用,要么需要额外的编程来深入研究,这与我的初衷不符。然而我将-ss参数往前减少了0.01s后,切出来的视频是正常的。虽然结果是好的,但这并没有规律,也不符合规范(不能提取出共性问题),至少要明白为什么会这样。

友认为,fib得出的关键帧位置不精确。遂在群友建议下,使用了Avidemux来查看关键帧(I帧)位置。但是,用在Avidemux和MPV上得到的关键帧位置分别作为ffmpeg的ss参数切割视频,都不能得到正确的结果,依然是被PotPlayer识别为音频。
后又经群友指导,直接用Avidemux对视频进行切割,结果很让人意外,生成的视频一切正常,完全符合要求。

本来以为这是最终的方法了,但我在翻阅ffmpeg官方文档的时候,发现了官方对seek(寻关键帧)和拷贝的说明:

Seeking while doing a codec copy

Using -ss as input option together with -c:v copy might not be accurate since ffmpeg is forced to only use/split on i-frames. Though it will—if possible—adjust the start time of the stream to a negative value to compensate for that. Basically, if you specify "second 157" and there is no key frame until second 159, it will include two seconds of audio (with no video) at the start, then will start from the first key frame. So be careful when splitting and doing codec copy.

差不多的意思是,流拷贝和截取同时使用可能会造成结果的不准确,必要时需要自己微调。这也应对了上面我说的,将-ss参数往前退一点。

本来都打算“认命”了,但是在无意中却发现了解决办法,就是添加-copyts参数,保留原来的时间戳。官方文档上是这样说的。

Note that if you specify -ss before -i only, the timestamps will be reset to zero, so -t and -to have not the same effect. If you want to keep the original timestamps, add the -copyts option.

其实我的-ss是放在-i后面的,对于上面这段话其实并不适用,但是这个参数就是莫名的起效了。我试了几个之前的缺帧视频,也是正常的。稍后会加入代码中。

总结一下解决办法。

  1. -ss参数以0.001或者0.01为单位往前回退,比如6.4就要改为6.399或者6.39,一个不行再试下一个,越靠近原始的时间越好。参数在本程序生成的视频文件名上,形如[filename]-cut_[keyframe_time]-end.flv,这个keyframe_time就是关键帧的时间位置。命令行命令:ffmpeg -i [input_filename] -ss [keyframe_time] -c copy [output_filename]
  2. 使用Avidemux直接定位到关键帧进行切割,左下角形如>><<的圆形按钮就是定位到关键帧的按钮,定位到第一个关键帧后,点击左下角一排的【设定为开始标记】按钮将其作为起始位置,在底部偏右侧可以看到当前要处理的片段的A/B时间(起始和终止时间),点击左上角【保存视频】按钮切割视频,音视频编码默认copy即可。
  3. 在ffmpeg命令中加入-copytsffmpeg -i [input_filename] -ss [keyframe_time] -c copy -copyts [output_filename],此方法会加入进本项目,敬请期待。

@Aric-Sun
Copy link
Owner Author

Aric-Sun commented Oct 8, 2020

代码已更新,问题解决,详见Release1.1.0

@Aric-Sun Aric-Sun closed this as completed Oct 8, 2020
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

1 participant