SomeBottle / PicVid

A simple PHP script that hides video data within image files.
https://resources.xbottle.top/picvid_demo/
MIT License
39 stars 20 forks source link

can't download when using ffmpeg #1

Closed kt286 closed 2 years ago

kt286 commented 2 years ago

When I use ffmpeg -i https://pv.xbottle.top/demo/rick.m3u8 -c copy output.mp4 to download the demo video, I got a error message:

[hls,applehttp @ 0x5610108cb670] Could not find codec parameters for stream 0 (Video: png, none(pc)): unspecified size                                                                                                      
Consider increasing the value for the 'analyzeduration' and 'probesize' options   
Input #0, hls,applehttp, from 'https://pv.xbottle.top/demo/rick.m3u8':                                        
  Duration: 00:03:32.44, bitrate: 0 kb/s
  Program 0 
    Metadata:
      variant_bitrate : 0
    Stream #0:0: Video: png, none(pc), 25 tbr, 25 tbn, 25 tbc
    Metadata:
      variant_bitrate : 0

Anothor demo video (https://pv.xbottle.top/demo/oyashirosama.m3u8) is sucessful.

SomeBottle commented 2 years ago

当然你是没法直接下载第一个m3u8视频的
第一个m3u8内指向的每一个切片头部都有一小块图片。在浏览器里利用hls播放是没有问题的,但如果用ffmpeg下载就会有解码问题。
而第二个视频虽然头部也有图片,但利用了m3u8的EXT-X-BYTERANGE选项,ffmpeg可以自动识别并去除头部的图片部分。
这也是为什么我要放两个demo

kt286 commented 2 years ago

不能再抢救一下了吗?

最新版 FFmpeg文档 里 hls 格式有个参数 seg_format_options ,看上去像是每个片段的选项。但是我加上 skip_initial_bytes 也不行,是我对这个参数有啥误解吗?

ffmpeg -f hls -seg_format_options skip_initial_bytes=80 -i https://pv.xbottle.top/demo/rick.m3u8 -c copy output.mp4
SomeBottle commented 2 years ago

不能再抢救一下了吗?

最新版 FFmpeg文档 里 hls 格式有个参数 seg_format_options ,看上去像是每个片段的选项。但是我加上 skip_initial_bytes 也不行,是我对这个参数有啥误解吗?

ffmpeg -f hls -seg_format_options skip_initial_bytes=80 -i https://pv.xbottle.top/demo/rick.m3u8 -c copy output.mp4

为什么参数值是80呢,我没记错头部图片是69字节吧

kt286 commented 2 years ago

不能再抢救一下了吗? 最新版 FFmpeg文档 里 hls 格式有个参数 seg_format_options ,看上去像是每个片段的选项。但是我加上 skip_initial_bytes 也不行,是我对这个参数有啥误解吗?

ffmpeg -f hls -seg_format_options skip_initial_bytes=80 -i https://pv.xbottle.top/demo/rick.m3u8 -c copy output.mp4

为什么参数值是80呢,我没记错头部图片是69字节吧

80 是我随手写的 但是改成 69 也不行

SomeBottle commented 2 years ago

seg_format_options这个配置项可太新了,几乎找不到更详细的解读,表面看来确实是切片格式选项
我需要摸索一下

SomeBottle commented 2 years ago

抱歉这个问题我无法解决,另外其实这个也不是PicVid项目本身的问题,我只能尽我所能帮你看一下解决方案。
奈何我现在寻找了很多博客文章和询问贴都没有能解决这个问题的。核心问题是:

[hls @ 0000025f7153e080] Could not find codec parameters for stream 0 (Video: png, none(pc)): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options

至于-seg_format_options skip_initial_bytes=69有没有起效果我也无从得知。

值得一提的是,rick.m3u8这个播放列表里的切片虽然头部都有一个69字节的图片,但是我在前端脚本里并没有特意去做去掉这头部69字节的操作,hls.js仍然可以正常播放,所以我推测其是可以在一定容错范围内寻找视频部分的标志性header。

通过ffmpeg命令行工具下载这些头部有多余字节的视频分片我并没有做过测试,也不知道你是出于什么需求。现在看来既没有这种操作的先例,我也难以解决此事(我自己菜)

如果你有一些场景需要去除分片头部多余字节的话,我的建议是在m3u8文件里用上选项EXT-X-BYTERANGE(这也是你为什么可以下载 https://pv.xbottle.top/demo/oyashirosama.m3u8 。如果你掌握了一门后端编程语言的话,不妨试着写个脚本来辅助去掉头部字节然后将分片下载下来进行二进制拼接。

最后,如果关于seg_format_options这个选项有任何新进展的话,欢迎重开issue继续讨论。