查看: 30292|回复: 12
上一主题 下一主题 跳转到指定楼层

修复无法播放的acfun视频文件

25

主题

77

存在感

28

活跃日
 3 

SOS团新手

发帖: 411
SOS币: 4260
注册: 2009-08-28
访问: 2015-12-25

楼主
发表于 2010/05/29 | 编辑

猜你喜欢: acfun视频黑屏, Acfun, 360


原文请移步:

https://www.deleak.com/blog/2010/05/29/fix-acfun-video/

下边是直接copy过来的,图片不显示什么的请多担待,我设置了图片防盗链。

    *
      这是一篇迟到近3个月的文章……

(停!windows 用户以及急欲修复视频的用户请停止继续阅读,请直接使用chunqing286的修复工具进行修复。)

在今年3月时候,就有朋友跟我抱怨说mplayer不能播放下载回来的flv文件(原帖)。这让我这个mplayer控何情以堪?所以要来地址亲自尝试,结果不出所料,failed miserably…

    视频地址:
    http://bilibili.us/video/av4193/
    【MMD】这不是Miku 这是221大人(请点击播放按钮以播放视频)

    视频下载:http://tj5.dhot.v.iask.com/f/1/6cdea1d8cb42d852a36df96c01fff20128983640.flv

    *
      分析

视频大小34.1m,首先通过mediainfo分析视频信息:

看起来没有什么异常?但那是仔细算一下就会发先问题所在:

结果是31.8m,与文件体积相差约0.4m。

只有文件头被破坏或者修改才可能发生文件识别错误的情况。

用mplayer播放以下看看错误信息:

Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffflv] vfm: ffmpeg (FFmpeg Flash video)

Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 44100 Hz, 2 ch, s16le, 32.0 kbit/2.27% (ratio: 4000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)

可以看到,mplayer使用了libavcodec进行分离,并调用ffflv和mp3解码器进行播放。整个步骤基本无误,而出了前几帧外,后边则有近20k行的解码失败日志。(full ver.)

基本可以判断是flv文件被修改而导致播放器播放失败。

    *
      flv文件结构

接下来就是自习flv文件结构时间,资料(1,2,3,4,5)—— 必修课

    现在是深入了解变态编码时间:——选修课

    之所以会产生畸形视频,是因为很多视频网站只保留视频索引,而视频文件并非保存在本地服务器。例如acfun,bilibili,均调用新浪的视频进行播放。因为本地不能存储视频,所以视频上传到新浪时,新浪会对码率,分辨率过大的视频进行压缩以保证流畅播放。因为二次压缩会影响视频质量,所以很多人研究了很多方法(资料)以避免上传的视频被新浪压缩。但是因为视频文件被刻意修改,所以普通播放器不能播放。

    目前最为常见的是前黑法。(理论上应该叫文件头重塑法吧~)

综合播放器日志及对flv文件头的分析,判定其文件头被修改。

一般来说,他们都是通过这个前黑+月亮合并器进行修改的(工具内含有两个分辨率版本的一秒h263黑屏视频和一个垃圾合并器)。之所以说合并器垃圾呢,是因为真的要忍不住吐槽了……用这么粗鲁的方式合并flv我也是此生仅见。倒也不错,成就了n多畸形flv。

因为合并器合并后的视频是1s h263+ 真正视频主体,而真正的视频和那一秒的黑屏视频参数有差别,合并器并未转换视频流以使flv文件结构正确,反而只是修改文件头,必然导致播放器播放失败。

    *
      修复!

删除多余数据法:

既然知道了是使用一秒黑屏的h263修改文件头强制合并,那么把问题视频的一秒黑屏数据删除即可实现视频文件修复。

使用十六进制编辑器打开需要修改的flv文件和一秒黑屏的原文件(上文已经提供打包下载)。

请仔细观察上左图(源视频)和上右图(1s黑屏),选中部分内容相同。所以把源视频文件  09 00 00 06 2C 后的部分删除即可(参照flv文件结构去~)。至于说删多少呢,删除文件头部分和一秒黑屏的交集部分就可以了。

如上图所示,删除至此即可。修改完毕:

把修改后的文件另存为flv文件。(请不要覆盖原有文件!)

如图所示,视频文件已经可以正常播放了

文件头替换法:

既然已经知道文件头是被损坏,那么使用完好的文件头对无法播放的视频文件头进行替换,理论上可以实现对已经损坏的文件的修复。

    *
      linux下的修复程序:

http://code.google.com/p/xflvtool/

arch+gcc编译成功,使用时失败,大家可以参考下代码~(话说还是手工修复感觉更hacky哦~)

    *
      吐槽时刻:

非常抱歉,这里没有你们能看到的怨念吐槽。总之,对视频文件头等其他部分的破坏和任意修改,都是对访客,新浪,乃至于视频制作者的不尊重,希望你们能自重。ps:不要在喊渣浪这个词,新浪免费提供空间为你们储存这些畸形文件,实乃大度。如果全部rm掉,也是理所应当,不要再对任何事务怀有怨念,而是应该以感恩的心去用……

    *
      特别感谢:

chunqing286,一心月,zhu527812567, ryoohki

    *
      参考资料:

http://weiyuhu.javaeye.com/blog/570237

http://noahgenius.javaeye.com/blog/164782

http://blog.sina.com.cn/s/blog_48f93b530100eyoe.html

http://blog.sina.com.cn/s/blog_4a741176010005tp.html

http://www.2dland.cn /space.php?uid=24&do=blog&id=434(需注册)

http://www.5uflash.com/flashjiaocheng/Fmsjiaocheng/2351.html

linux快速入门教程+进阶手册

655

主题

2082

存在感

667

活跃日
喵~离线 有意栽花不如无心插柳
 9 

家中的荣誉团员

1楼
发表于 2010/05/29 | 编辑
http://acfun.chunqing286.com
AcFunLocalizer全自动修复……

25

主题

77

存在感

28

活跃日
 3 

SOS团新手

2楼
发表于 2010/05/29 | 编辑
引用第1楼azuretimm2010-05-29 23:18发表的“”:
http://acfun.chunqing286.com
AcFunLocalizer全自动修复……


文章中我也提到过,这个工具是可以修复的

但是linux无法运行此类工具,所以手工修复

162

主题

256

存在感

134

活跃日
 4 

SOS团一星级★

3楼
发表于 2010/05/29 | 编辑
我表示什么教程都没看过,但是我会修复。也不需要什么乱七八糟的工具,一个月亮FLV剪切器就够了。移动时间线,发现移动关键帧而时间刻度没变法的部分就是黑屏补丁了,然后标记切之。

25

主题

77

存在感

28

活跃日
 3 

SOS团新手

4楼
发表于 2010/05/29 | 编辑
引用第3楼凝芳文2010-05-29 23:38发表的“”:
我表示什么教程都没看过,但是我会修复。也不需要什么乱七八糟的工具,一个月亮FLV剪切器就够了。移动时间线,发现移动关键帧而时间刻度没变法的部分就是黑屏补丁了,然后标记切之。


linux无法使用那个工具……

手工修复更hacky,不是吗 :)

25

主题

122

存在感

271

活跃日
帅哥离线 zj262144
 4 

SOS团一星级★

5楼
发表于 2010/05/30 | 编辑
有些长……

应该没提到三倍速BUG视频的修复吧?

这个其实相当简单
把flv重封装成mp4即可解决

这个问题貌似AcFunLocalizer不能解决

25

主题

77

存在感

28

活跃日
 3 

SOS团新手

6楼
发表于 2010/05/30 | 编辑
引用第5楼upyzl2010-05-30 00:20发表的“”:
有些长……

应该没提到三倍速BUG视频的修复吧?

这个其实相当简单
.......


这个样子的视频没有遇到过,不过既然是3倍速,使用mplayer降速播放就可以?

只要文件头没有错误基本上就可以播放,只要能播放,就能用播放器进行处理啦

162

主题

256

存在感

134

活跃日
 4 

SOS团一星级★

7楼
发表于 2010/05/30 | 编辑
引用第5楼upyzl2010-05-30 00:20发表的“”:
有些长……

应该没提到三倍速BUG视频的修复吧?

这个其实相当简单
.......



你这个办法我以前试过,貌似不成功。刚才也试了次,还是没成功。特意贴上转换的信息,我这个是因为哪里出了问题呢?

FFmpeg version SVN-r22636, Copyright (c) 2000-2010 the FFmpeg developers
  built on Mar 23 2010 01:28:21 with gcc 4.4.1
  configuration:
  libavutil     50.12. 0 / 50.12. 0
  libavcodec    52.59. 0 / 52.59. 0
  libavformat   52.57. 1 / 52.57. 1
  libavdevice   52. 2. 0 / 52. 2. 0
  libswscale     0.10. 0 /  0.10. 0
[flv @ 0x3dc490]Estimating duration from bitrate, this may be inaccurate

Seems stream 0 codec frame rate differs from container frame rate: 1000.00 (1000/1) -> 30.17 (181/6)
Input #0, flv, from '【MMD】東方漢娘祭!!よっしゃあ漢唄!.flv':
  Metadata:
    creator         : you.video.sina.com.cn
    metadatacreator : Yet Another Metadata Injector for FLV - Version 1.2
    hasKeyframes    : true
    hasVideo        : true
    hasAudio        : true
    hasMetadata     : true
    canSeekToEnd    : false
    duration        : 290
    datasize        : 24793418
    videosize       : 23545882
    videocodecid    : 2
    width           : 512
    height          : 384
    framerate       : 30
    videodatarate   : 633
    audiosize       : 1187880
    audiocodecid    : 2
    audiosamplerate : 44100
    audiosamplesize : 16
    stereo          : false
    audiodatarate   : 30
    filesize        : 24795069
    lasttimestamp   : 290
    lastkeyframetimestamp: 288
    lastkeyframelocation: 24698534
  Duration: 00:04:49.60, start: 0.000000, bitrate: 679 kb/s
    Stream #0.0: Video: h264, yuv420p, 512x384, 647 kb/s, 30.17 tbr, 1k tbn, 1k tbc
    Stream #0.1: Audio: mp3, 44100 Hz, 1 channels, s16, 32 kb/s
Unknown encoder 'rmvb'

162

主题

256

存在感

134

活跃日
 4 

SOS团一星级★

8楼
发表于 2010/05/30 | 编辑
啊~~~自己更正。原来我刚才把编码器填成RMVB了,哈哈。白痴了一次了,现在是能封装MP4,可是封装后播放依旧是不正常呀。

25

主题

122

存在感

271

活跃日
帅哥离线 zj262144
 4 

SOS团一星级★

9楼
发表于 2010/05/30 | 编辑
我用的是flvextract+mp4box/mkvmerge
单纯提取视音频再混流

关于我们|无图版|SOSG WIKI

Copyright © 2006-2024 SosG.Net
Total 0.010385(s) query 6, Gzip enabled,  沪ICP备07006640号-3