【问题标题】:How to play avi files on browser如何在浏览器上播放avi文件
【发布时间】:2017-05-19 00:57:06
【问题描述】:

我的团队需要开发一个在网络上播放 avi 文件的系统。这些文件由我们无权访问其固件的硬件记录。我们正在尝试与制造商协商将文件格式更改为 mp4,但到目前为止我们一无所获。

因此,我们正在尝试另一种方式来使其发挥作用。我们的第一次尝试是使用 FFMPEG 将文件转换为 mp4(或 webm 或 ogg),但这个过程耗时太长,因为我们每天都必须处理大量视频。

我们也尝试使用 FFMPEG 的复制命令(速度更快),但视频总是在某个时间点崩溃(主要是当我们需要在其时间线中导航时)我们不知道为什么。

所以现在我们正在考虑定制videojs flash player来重现AVI文件,但是因为我们对视频编程和flash没有太多的经验,所以不知道这是否可行。是否可以在动作脚本中编写解码器来读取 avi 文件?

我看到 Youtube 和 Facebook 可以播放 AVI 文件...他们是怎么做到的?我已经看了很多,但没有成功。

编辑 1

复制命令前的avi视频文件:

$ ffmpeg -i video.avi
ffmpeg version N-82324-g872b358 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dx                                                                                                                                                                                               va2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-lib                                                                                                                                                                                               ebur128 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --ena                                                                                                                                                                                               ble-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfree                                                                                                                                                                                               type --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enab                                                                                                                                                                                               le-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-lib                                                                                                                                                                                               openh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschr                                                                                                                                                                                               oedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheor                                                                                                                                                                                               a --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvo                                                                                                                                                                                               rbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --ena                                                                                                                                                                                               ble-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --e                                                                                                                                                                                               nable-decklink --enable-zlib
  libavutil      55. 36.100 / 55. 36.100
  libavcodec     57. 66.101 / 57. 66.101
  libavformat    57. 57.100 / 57. 57.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 66.100 /  6. 66.100
  libswscale      4.  3.100 /  4.  3.100
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Input #0, avi, from 'video.avi':
  Metadata:
    encoder         :
  Duration: 00:50:07.67, start: 0.000000, bitrate: 6 kb/s
    Stream #0:0: Video: h264 (Constrained Baseline) (H264 / 0x34363248), yuv420p                                                                                                                                                                                               (progressive), 352x240, 3 fps, 3 tbr, 3 tbn, 6 tbc
At least one output file must be specified

复制命令(没有音频流,因为视频没有):

$ ffmpeg -i video.avi -vcodec copy video.mp4
ffmpeg version N-82324-g872b358 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-libebur128 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55. 36.100 / 55. 36.100
  libavcodec     57. 66.101 / 57. 66.101
  libavformat    57. 57.100 / 57. 57.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 66.100 /  6. 66.100
  libswscale      4.  3.100 /  4.  3.100
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Input #0, avi, from 'video.avi':
  Metadata:
encoder         :
  Duration: 00:50:07.67, start: 0.000000, bitrate: 6 kb/s
Stream #0:0: Video: h264 (Constrained Baseline) (H264 / 0x34363248), yuv420p(progressive), 352x240, 3 fps, 3 tbr, 3 tbn, 6 tbc
Output #0, mp4, to 'video.mp4':
  Metadata:
encoder         : Lavf57.57.100
Stream #0:0: Video: h264 (Constrained Baseline) ([33][0][0][0] / 0x0021), yuv420p(progressive), 352x240, q=2-31, 3 fps, 3 tbr, 12288 tbn, 3 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
Press [q] to stop, [?] for help
[mp4 @ 0000000002513fc0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properly
[NULL @ 0000000002524020] missing picture in access unit with size 16
Last message repeated 300 times
frame= 9324 fps=0.0 q=-1.0 Lsize=    1388kB time=01:38:27.66 bitrate=   1.9kbits/s speed=3.32e+004x
video:1354kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.493988%

复制命令后的mp4视频文件:

$ ffmpeg -i video.mp4
ffmpeg version N-82324-g872b358 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-dx                                                                                                                                                                                               va2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-lib                                                                                                                                                                                               ebur128 --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --ena                                                                                                                                                                                               ble-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfree                                                                                                                                                                                               type --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enab                                                                                                                                                                                               le-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-lib                                                                                                                                                                                               openh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschr                                                                                                                                                                                               oedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheor                                                                                                                                                                                               a --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvo                                                                                                                                                                                               rbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --ena                                                                                                                                                                                               ble-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --e                                                                                                                                                                                               nable-decklink --enable-zlib
  libavutil      55. 36.100 / 55. 36.100
  libavcodec     57. 66.101 / 57. 66.101
  libavformat    57. 57.100 / 57. 57.100
  libavdevice    57.  2.100 / 57.  2.100
  libavfilter     6. 66.100 /  6. 66.100
  libswscale      4.  3.100 /  4.  3.100
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
major_brand     : isom
minor_version   : 512
compatible_brands: isomiso2avc1mp41
encoder         : Lavf57.57.100
  Duration: 01:38:28.00, start: 0.000000, bitrate: 1 kb/s
Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yu                                                                                                                                                                                               v420p, 352x240, 1 kb/s, 1.58 fps, 3 tbr, 12288 tbn, 24576 tbc (default)
Metadata:
  handler_name    : VideoHandler
At least one output file must be specified

编辑 2

如果有人想测试,我上传了两个小样本:

【问题讨论】:

  • 您应该显示一些有关 AVI 文件的信息:ffmpeg -i input.avi。我们如何重现“视频总是在某些时候崩溃,我们不知道为什么”的问题?
  • 这取决于编解码器。如果它的 AVC/VP9、AAC/OOG 那么它可以简单地重新打包(无论是服务器端,还是在浏览器中。在浏览器中更难)。如果是不同的编解码器,您别无选择,只能转码。最好的办法是修复 ffmpeg 崩溃。
  • 添加了日志,@LordNeckbeard!如果您还需要什么,请告诉我。
  • “未在流 0 的数据包中设置时间戳...” 解释了当您尝试在某些媒体播放器中搜索时发生的崩溃。检查 FFmpeg 是否有修复时间戳的命令,如果genPTS 有意义,请检查文档...
  • 谢谢@VC.One!我会看看。 @Mulvya,你有什么建议吗?

标签: flash video ffmpeg video.js avi


【解决方案1】:

我们也尝试使用 FFMPEG 的 copy 命令(速度更快),但是 视频总是在某个时候崩溃(主要是当我们需要 在它的时间线中导航),我们不知道为什么。

这是您的re-fixed MP4 的链接。正在寻找。
我手动检查了字节,我怀疑时间戳是错误的。

FFprobe(使用ffprobe video.avi)表示 AVI 持续时间为 5.88 秒。 MPC-HC 也显示持续时间为 6 秒(四舍五入)。现在我们稍后希望 MP4 在使用copy 命令时也具有相同的 5.88 持续时间。但是在copy之后,输出的MP4又多了一个10秒的时长???

MP4 将持续时间放在 3 个位置。每个软件都有自己的规则来检查哪个条目,所以为了大家的利益,最好编辑所有 3 个位置。元数据分为“原子”,因此我们编辑了 3 个原子。

这些名为mvhdtkhdelst 的原子的持续时间都为00 00 28 87 的字节值,等于10375 毫秒(或10.375 秒)。 这是错误的,因为我们想要 5880 毫秒(或 5.88 秒)。我手动将它们全部从00 00 28 87 更改为00 00 16 F8,它给出了5880 毫秒。现在 MPC-HC 认为 mp4 是 5 秒(呸!!),但 Chrome 一直说它仍然是 10 秒(该死!!)。

作为最后的手段,我检查了一个名为stts 的原子。这有 3 个项目,总共 136 帧(注意 FFprobe 说 AVI 实际上有 141 帧)。无论如何,第一项表示前 128 帧的显示时间为 512 毫秒(持续时间为128 * 512 = 65536 ms)。这是错误的。

长话短说。我编辑了stts 说...

  • 除了03,只有01 显示时间条目(但其他条目字节未被删除)。
  • 不是00 00 00 80 = 128,而是00 00 00 8D = 141帧
  • 我仍然将这些(现在 141 帧)的原始显示时间保留为 00 00 02 00 = 512 毫秒
  • 我将剩余的两个条目字节全部更改为零(因为我们不需要使用它们)。

这就是您的 MP4 如何成为在 Chrome 浏览器中测试的可搜索文件。

结论:

要修复您自己的文件,我怀疑只编辑 MP4 元数据中stts 部分的第一个条目就足够了。你是在告诉它“我有 X 帧,每帧显示 X 间隔,没有额外内容!!”。然后只需在mvhdtkhdelst 中编辑持续时间。在这里你必须知道如何使用字节。

编写一个桌面程序(如果您的团队中有人可以这样做)......

  • 从 AVI 获取“持续时间”和“总帧数”(我推荐 ExifTool 而不是 FFprobe,因为它可以正确显示这两个细节)。您的程序通过 std in/out 读取此信息。

  • 一旦知道,将原子名称搜索为 UTF 文本以在字节内找到它们的开始位置。

  • 当您拥有每个起始位置后...您现在将数字编辑为 4 字节整数(以十六进制表示法编写)

    • 查找“mvhd”的起始位置,然后跳过 20 个字节以查找持续时间。
    • 查找“tkhd”的起始位置,然后跳过 24 个字节来查找持续时间。
    • 查找“elst”的起始位置,然后跳过 24 个字节来查找持续时间。
  • 最后找到“stts”的起始位置,然后跳过 8 个字节来查找总条目(4 个字节)。之后接下来的 4 个字节是“总帧数”数(你用实数修复),然后接下来的 4 个字节是帧的计时,但保持不变......

其他查询: ...

是否可以在动作脚本中编写解码器来读取 avi 文件? 我看到Youtube和Facebook都可以播放AVI文件...他们是怎么做的 这个?

是的!由于您的 AVI 具有 Mpeg (H.264) 视频,因此 Flash 具有接受 MPEG a/v 字节的解码器,因此如果您从 AVI 提取帧字节并将它们提供给解码器,它将显示出来。

这个旧的demo app 是我将 Mpeg 的 AAC 音频字节提供给解码器的一个例子。 AVI 的原理相同。我使用 Flash,但我会告诉你...修复文件比世界上只有一个自定义应用程序可以播放它们更好。固定文件可在 Flash、HTML5 浏览器和其他任何地方使用。

PS : Facebook 和 Youtube 正在重新编码您的文件。这不是直接的文件副本。

【讨论】:

  • 显示时间为 512 毫秒 - 这是时基单位,而不是毫秒。对于 12288 的 tbn,512 表示 512/12288 s = 0.0416 s = 1/24 s。
  • 这太棒了,@VC.One!我们会尝试的!我尽快回来!非常感谢!
  • 谢谢@Mulvya ...啊时基!!大脑知道timeScale。注意:FFprobe 说 AVI 有一个tbn = 24。我想知道编码器是否将 frame-rate 就像 tbn 用于 AVI?后来在更换容器时会导致一些问题?无论如何,正如你所指出的......编解码器(h.264)部分损坏,我们看到标题(avi)没有正确填充,我不明白如何他们被授权对 H.264 视频进行编码,但不知何故不能将其包含在官方 MP4 中? PS:见this image,它来自链接的OP 不可搜索的MP4 视频的MP4 元数据。我很困惑;-)
  • @mvalencaa 你说视频来自外部硬件,对吧?我的意思是,它是否被归类为您计算机中的视频捕获设备?如果是,那么也许 FFmpeg 本身可以通过来自硬件的输入来捕获和编码 MP4...
  • 对,但硬件是车内的 DVR,不幸的是我们无法访问其固件。 @VC.One
【解决方案2】:

我们终于解决了这个问题。

虽然@VC.One 的解决方案似乎有效,但我们没有成功,因为我们认为有更好的方法来解决它而不必进行字节操作(一旦我们不需要太多经验) ...

经过多次尝试,我们发现我们的 AVI 文件格式不正确,所以我们使用了一个名为 Mencoder 的程序,该程序具有 forceidx 功能:

强制重建索引。对于索引损坏的文件(A/V 不同步等)很有用。这将允许在无法查找的文件中查找。您可以使用 MEncoder 永久修复索引(请参阅文档)。 注意:此选项仅在底层媒体支持搜索(即不使用标准输入、管道等)时才有效。

运行此命令后,我们使用 FFMPEG 的复制命令将(现在格式良好的)AVI 文件“转换”为 mp4。瞧!奇迹发生了!

非常感谢大家!

谢谢@VC.One,您的时间花在了这里!

【讨论】:

  • 能否请您添加用于修复.avi 文件的mencoder 命令??
猜你喜欢
  • 2017-03-22
  • 2013-10-07
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多