如何创建 WebM 视频文件?

Posted

技术标签:

【中文标题】如何创建 WebM 视频文件?【英文标题】:How to create a WebM video file? 【发布时间】:2011-10-20 18:08:37 【问题描述】:

浏览网络后,我发现无法生成 WebM 视频。我看到了适用于 Windows 和 QuickTime 的驱动程序,但没有证据表明支持最常见的实用程序 FFmpeg。

是否有任何开源转换器可以生成 WebM?

【问题讨论】:

【参考方案1】:

您可以使用ffmpeg 转换为WebM。确保使用--enable-libvpx--enable-libvorbis 标志编译它(请参阅FFmpeg compile guides),或访问FFmpeg Download 页面以获取包含支持的构建链接。之后,您可以使用以下命令(我使用input.flv 作为我的示例输入文件):

ffmpeg -i input.flv -vcodec libvpx -acodec libvorbis output.webm

有关更多信息,请参阅FFmpeg vpx (WebM) Encoding Guide。

【讨论】:

或带有质量标志的别名短版本(范围在 0(低)和 10(高)之间):ffmpeg -i input.flv -q:v 10 -c:v libvpx -c:a libvorbis output.webm 如文档中所述,设置比特率很重要:Important: If neither -b:v nor -crf are set, the encoder will use a low default bitrate and your result will probably look very bad. Always supply one of these options—ideally both.trac.ffmpeg.org/wiki/vpxEncodingGuide 请注意,此类转换并不能保证正确的提示对齐,从而允许在媒体源扩展 (MSE) JS API 中使用此类 webm 文件。见***.com/questions/14037112/… 如果您不希望 WebM 中有声音,请使用 -an 而不是 -acodec libvorbis。您还可以将其限制在视频的某个部分,例如 -ss 00:01:00 -to 00:02:00 以从 1:00 到 2:00(1 分钟长)进行复制。 您可能需要使用这些额外的库重新安装 ffmpeg 才能使其工作。以下是我发现有用的两个资源 trac.ffmpeg.org/wiki/CompilationGuide/MacOSX 和 gist.github.com/clayton/6196167【参考方案2】:
ffmpeg -i input.mp4 -c:v libvpx -crf 10 -b:v 1M -c:a libvorbis output.webm

默认情况下,CRF 值可以从 4 到 63,而 10 是一个很好的起点。较低的值意味着更好的质量。

【讨论】:

【参考方案3】:

我最近设置了这个,但有点痛苦。这是我必须做的:

首先,从源代码构建 ffmpeg 以包含 libvpx 驱动程序(即使您使用具有它的版本,您也需要最新的(截至本月)来流式传输 webm,因为它们只是添加了包含全局标头的功能)。我是在 Ubuntu 服务器和桌面上完成的,this guide 向我展示了如何 - 其他操作系统的说明 can be found here。

获得适当版本的 ffmpeg/ffserver 后,您可以将它们设置为流式传输,在我的例子中,这是按如下方式完成的。

在视频捕获设备上:

ffmpeg -f video4linux2 -standard ntsc -i /dev/video0 http://<server_ip>:8090/0.ffm
其中的“-f video4linux2 -standard ntsc -i /dev/video0”部分可能会根据您的输入源而改变(我的是用于视频采集卡)。

相关ffserver.conf摘录:

Port 8090
#BindAddress <server_ip>
MaxHTTPConnections 2000
MAXClients 100
MaxBandwidth 1000000
CustomLog /var/log/ffserver
NoDaemon

<Feed 0.ffm>
File /tmp/0.ffm
FileMaxSize 5M
ACL allow <feeder_ip>
</Feed>
<Feed 0_webm.ffm>
File /tmp/0_webm.ffm
FileMaxSize 5M
ACL allow localhost
</Feed>

<Stream 0.mpg>
Feed 0.ffm
Format mpeg1video
NoAudio
VideoFrameRate 25
VideoBitRate 256
VideoSize cif
VideoBufferSize 40
VideoGopSize 12
</Stream>
<Stream 0.webm>
Feed 0_webm.ffm
Format webm
NoAudio
VideoCodec libvpx
VideoSize 320x240
VideoFrameRate 24
AVOptionVideo flags +global_header
AVOptionVideo cpu-used 0
AVOptionVideo qmin 1
AVOptionVideo qmax 31
AVOptionVideo quality good
PreRoll 0
StartSendOnKey
VideoBitRate 500K
</Stream>

<Stream index.html>
Format status
ACL allow <client_low_ip> <client_high_ip>
</Stream>
请注意,这是为 feeder_ip 上的服务器配置的,以执行上述 ffmpeg 命令,并为 server_ip 上的服务器配置,因此在 server_ip 上处理 mpeg 到 webm 的对话时,通过 client_high_ip 服务器到 client_low_ip(下文继续)。

这个 ffmpeg 命令在以前称为 server_ip 的机器上执行(它处理实际的 mpeg --> webm 转换并将其反馈到不同提要上的 ffserver):

ffmpeg -i http://<server_ip>:8090/0.mpg -vcodec libvpx http://localhost:8090/0_webm.ffm

一旦这些都启动了(首先是 ffserver,然后是 feeder_ip ffmpeg 进程,然后是 server_ip ffmpeg 进程),您应该能够在 http://:8090/0.webm 访问实时流并检查http://:8090/的状态

希望这会有所帮助。

【讨论】:

【参考方案4】:

对于 Linux: 可用于 linux 的 vp8 和 vp9 编解码器的开源软件是用于 gnome 桌面的 Arista。谷歌:Arista 转码器

适用于 Windows 和 Linux: Miro Video Converter 也是免费的开源软件,具有非常流畅的 GUI。您可以在以下位置查看:谷歌:mirovideoconverter

FFMPEG 是一个命令行工具,我发现它是跟上 webmd 项目的最新版本。不要忘记查看 webmproject 站点提供的 vp8 编码选项 https://sites.google.com/a/webmproject.org/wiki/ffmpeg。您还应该看看 VPX 编码指南: https://trac.ffmpeg.org/wiki/vpxEncodingGuide

另一个帖子提到vpxenc.exe,但是vpxenc.exe需要源码编译。

FFMEG 示例使用: 将 NPUT 和 OUTPUT 替换为文件位置。在 Windows 7 上,我必须使用 power shell (开始 > 附件 > Windows Power Shell > Power Shell) 并提供 ffmpeg、输入和输出的完整位置。注意参数-vcodec libvpx默认使用VP8。要使用 VP9 替换为 -vcodec libvpx-vp9

婚礼视频

ffmeg.exe -i INPUT -s hd480 -vcodec libvpx -g 120 -lag-in-frames 16 -deadline good -cpu-used 0 -vprofile 0 -qmax 63 -qmin 0 -b:v 768k -acodec libvorbis -ab 112k -ar 44100 -f webm OUTPUT

【讨论】:

注意:Arista 和 Miro 都使用ffmpeg 来进行实际的转码。【参考方案5】:

FFmpeg。 MP4 到 WebM。口型同步和高质量

$ ffmpeg -i input.mp4 -b:v 1M -q:v 10 -vcodec libvpx -acodec libvorbis output.webm
ffmpeg version 2.8.6-1ubuntu2 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.3.1 (Ubuntu 5.3.1-11ubuntu1) 20160311
  configuration: --prefix=/usr --extra-version=1ubuntu2 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'SPBFRE_01.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2015-05-29 14:49:20
  Duration: 00:01:41.61, start: 0.000000, bitrate: 9452 kb/s
    Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 9132 kb/s, 50 fps, 50 tbr, 50k tbn, 100 tbc (default)
    Metadata:
      creation_time   : 2015-05-29 14:49:20
      handler_name    : ?Mainconcept Video Media Handler
      encoder         : AVC Coding
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2015-05-29 14:49:20
      handler_name    : #Mainconcept MP4 Sound Media Handler
File 'output.webm' already exists. Overwrite ? [y/N] y
[libvpx @ 0x132af40] v1.5.0
Output #0, webm, to 'output.webm':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    encoder         : Lavf56.40.101
    Stream #0:0(eng): Video: vp8 (libvpx), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 1000 kb/s, 50 fps, 1k tbn, 50 tbc (default)
    Metadata:
      creation_time   : 2015-05-29 14:49:20
      handler_name    : ?Mainconcept Video Media Handler
      encoder         : Lavc56.60.100 libvpx
    Stream #0:1(eng): Audio: vorbis (libvorbis), 44100 Hz, stereo, fltp (default)
    Metadata:
      creation_time   : 2015-05-29 14:49:20
      handler_name    : #Mainconcept MP4 Sound Media Handler
      encoder         : Lavc56.60.100 libvorbis
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> vp8 (libvpx))
  Stream #0:1 -> #0:1 (aac (native) -> vorbis (libvorbis))
Press [q] to stop, [?] for help
frame=  755 fps= 10 q=0.0 size=    1987kB time=00:00:15.12 bitrate=1076.5kbits/s 

【讨论】:

【参考方案6】:

MiroVideoConverter 是一个不错的跨平台开源 ffmpeg 包装器,尤其支持转换为 WebM。

【讨论】:

【参考方案7】:

我不确定我的 FFMPEG 副本是否支持 WebM,所以我首先使用 FFMPEG 将我的 MPEG4 视频转换为原始视频。

然后我使用 WebM 项目的 SDK 提供的 vpxenc.exe 将其转换为 WebM。

SDK 下载链接: http://code.google.com/p/webm/downloads/list

下载、解压并查看“bin”文件夹。那里有一些示例应用程序。还提供解码器。

我用来将原始视频转换为 WebM 的命令:

vpxenc.exe -w 720 -h 480 --rt -o v1.webm v1.yuv

HTH

【讨论】:

只需安装带有 libvpx 和 libvorbis 的 ffmpeg 即可完全支持 webm,这应该始终是默认设置。【参考方案8】:

试试avconv:

avconv -i inmovie.mp4 -flags global_header -strict experimental outmovie.webm

【讨论】:

【参考方案9】:

如果您正在寻找一种简单的图形方式来实现此目的,另一种选择是 HandBrake(尽管 HandBrake 确实也有 commandline flavor,以防万一编写该过程的脚本,或者可能只是更喜欢命令行)。就像其他人在此处建议的 ffmpeg 一样,HandBrake 可在 Linux、Mac 和 Windows 上使用,因此您使用的操作系统无关紧要。流程和界面几乎一模一样。

现在,.webm 容器基本上只是一个 Matroska 文件,但真正使它成为 webm 的是它包含的流。根据WebM Project,视频流必须是 VP8 或 VP9,音频流必须是 Vorbis 或 Opus,因此在使用 HandBrake 时,您需要确保正确设置这些选项。

因此,要将视频编码为 webm,当然,您需要选择一个视频,所以让我们先这样做。在 HandBrake 窗口顶部的工具栏中,第一个选项显示“开源”。它不是指软件的性质(尽管它实际上是开源软件),而是指使用您的操作系统的您可能已经不止一次看到过标准文件请求程序窗口。单击该按钮,然后导航到系统上您要编码为 webm 文件的视频。

现在您已经选择了一个文件,界面的一些位会更新一些新信息,您可以开始为您的转换选择选项。有很多有趣的选择,但对于这个答案,我们将关注与“如何创建 webm 视频文件?”问题相关的选择。而不是详细讨论每个选项。如果您对更多详细信息感兴趣,可以随时阅读HandBrake Documentation。

在启动 HandBrake 后看到的选项的第一页,大约一半时,您会看到“格式:”以及“MPEG-4”或“Matroska”选项。这将选择容器。对于 webm,您需要“Matroska”。 您会在上面看到一个选项按钮栏,可在各个页面之间切换。您可以在那里设置各种漂亮的选项,但我们接下来想要的是“视频”,因此单击它并查找“视频编码器:”,您将根据自己的喜好将其设置为“VP8”或“VP9”和用例。 VP9 较新且压缩效果更好,但需要更多 CPU 工作来进行编码和播放,因此请记住这一点。 最后但同样重要的是,让我们看看“音频”选项。因为您选择了一个视频,所以“音频”页面的“曲目列表”框中应该至少有 一个 (可能不止一个) 音频流。该音轨的左侧列出了该音轨当前的格式(例如English (AC3)(5.1 ch)(48khz) Bitrate: 448kbps)。 -&gt; 的右侧列出了您要从左侧转换为 的格式。这就是我们需要确保 Vorbis 或 Opus 的地方。 单击您正在编码的音轨最右侧的小铅笔图标,您将在屏幕上看到一个新窗口,您可以在其中选择要编码的音轨,更重要的是,可以选择编码器详细信息。确保将编码器设置为 Vorbis 或 Opus(Opus 比 Vorbis 更新且总体上更好,所以可能几乎每次都选择那个),然后选择 128、160 或 192大多数正常用途的比特率。您可以调高或调低,但要知道调高会增加音轨的大小,而音频质量不会有太多(如果有的话)明显改善,而调低很多时您可能会开始注意到音频质量下降音轨。 “混合”设置将是个人喜好,具体取决于源材料和您对输出的需求。采样率通常应设置为 48。“增益”和“DRC”是指您的音轨太安静,并且整个音轨的响亮和柔和电平之间存在巨大差异。点击该窗口上的“确定”以锁定您的选择。 在窗口底部,您会看到带有文件名的“另存为:”和带有文件夹的“收件人:”。 “收件人:”是您可以选择文件保存位置的位置,“另存为:”是您选择要命名的文件的位置。如果您尝试创建.webm 文件,请确保您的文件名实际上 .webm 结尾,或者您只是在使用 webm 流创建 Matroska 文件。 (完全有效,但是如果一些不太复杂的软件需要 webm 并且文件被命名为 something.mkv,尽管它们是相同的,只是文件名不同,可能会感到困惑。)

此时您应该准备好单击工具栏中的“开始编码”以立即开始编码,或者如果您正在编码许多视频并且只想开始一个列表并全部完成,则可以单击“添加到队列”一个又一个自动。现在你就等着吧。这可能需要一段时间,所以请耐心等待。完成后它会通知您。

【讨论】:

以上是关于如何创建 WebM 视频文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 java 合并 .webm(音频)文件和 .mp4(视频)文件?

如何将传入的二进制块连接到视频(webm)文件节点js中?

WebM 也适用于音频,还是仅适用于视频?

透明视频,如何在每台设备上正确显示 webm 文件的 alpha 通道; VP9 还是 VP8 编码?

在 NodeJs 中解码 base64 编码的 webm 视频

JavaCV音视频开发宝典:vb8和vp9编码的webm格式视频文件转成mp4文件