@无名啊,回复8楼,我研究了下,目前动态照片各个厂商的具体实现细节略有差异,但没有用 Motion JPEG做的,都是单帧jpg+mp4文件拼接(h264或h265均有)。
小米和谷歌的动态照片的文件结构是,前面的字节流是正常的一帧的jpg高清照片,尾部直接拼接一个mp4文件,mp4文件的偏移地址在jpg文件的元数据里保存;
三星的动态照片的文件结构是,一个正常的一帧jpg高清照片,在照片的元数据内,嵌入了一个mp4视频二进制。
这里有一个bash脚本,它直接查找文件中mp4格式头标识"ftypmp42",提取动态照片中的mp4视频:https://github.com/keith-turner/motion-photos/blob/master/mvimg_jpg_extract.sh
层主 @咯叽 于 2024-02-23 22:31 删除了该楼层。
@tasy5kg,对了,我有一些 HEVC 视频(假设都是 30 fps,1h 的视频),但仅开头处有 1 个 I 帧,其余全是 B 帧,导致无法随意拖动进度条。
你知道,如何每 10 秒,重编码一个 B 帧为 I 帧(仅需重编码 360 帧 ),而不是全部重编码(要重编码 10.8W 帧),来修复视频吗?
@tasy5kg,看了看文档,libsvtav1 确实只支持 8/10 bit。。
但 avifenc 支持 12 bit。我搜索论坛里的 mp4 文件,选了其中三个,试了试转成动图,确实 12 bit 能比 8 bit 再小 20% 左右。
转码脚本(Windows 下可用 600KB 的 busybox-w32 来运行,要求
PATH
处能找到ffmpeg
、avifenc
):speed=5 quality=50 for file in *.mp4; do for depth in 8 10 12; do ffmpeg -v quiet -i "$file" -strict -1 -pix_fmt "yuv420p$( [[ $depth == 8 ]] && echo '' || echo "${depth}le" )" -f yuv4mpegpipe - | avifenc -q "$quality" -s "$speed" --min 0 --max 63 --stdin "${depth}bit_${speed}s_${quality}q_${file%.*}.avif" done done
文件所在帖子:
@无名啊,HEIF不能与动态照片同时开启。libsvtav1只支持yuv420p和yuv420p10le像素格式
层主 @咯叽 于 2024-02-23 22:30 删除了该楼层。
层主 @咯叽 于 2024-02-23 22:30 删除了该楼层。
层主 @咯叽 于 2024-02-23 22:30 删除了该楼层。
@tasy5kg,诶,K40 不是天生支持 HEIF 吗?直接用这个,压缩率就能挺高了的吧?
另外,尝试 12bit 了吗?体积有进一步下降吗?
@无名啊,你可以用K40开启动态照片拍照试试,拍出来是一个大分辨率的图像+较低分辨率的视频
@tasy5kg,另外,好像 webp、HEIF、AVIF,都支持动图?
@tasy5kg,我的意思是,AVIF 也是 AV1 编码的。
说不定你转视频时,也用 12bit,会发现体积又瞬间小一些了呢?(好像有 20% ?)
@无名啊,我手机拍了很多动态照片(jpg格式但包含一小段视频),如果当做正常图片压缩,视频会丢失,所以暂时舍不得压缩
@tasy5kg,以前我转 AVIF 照片时,意外发现,像素格式是 12bit 的话,体积会比 8bit、10bit 下降很多。。
但是 Windows 只支持 8bit 的。。
层主 @咯叽 于 2024-02-23 22:30 删除了该楼层。
帖子暂时删除,待补充内容后重发
层主 @咯叽 于 2024-02-23 22:30 删除了该楼层。
层主 @咯叽 于 2024-02-23 22:30 删除了该楼层。
层主 @咯叽 于 2024-02-07 21:33 删除了该楼层。