我正在尝试将具有此输出的 .ts 文件转换为 mkv:
ffmpeg version 4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
built with Apple clang version 12.0.0 (clang-1200.0.32.27)
configuration: --prefix=/usr/local/Cellar/ffmpeg/4.3.1_4 --enable-shared --enable-pthreads --enable-version3 --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librtmp --enable-libspeex --enable-libsoxr --enable-videotoolbox --disable-libjack --disable-indev=jack
libavutil 56. 51.100 / 56. 51.100
libavcodec 58. 91.100 / 58. 91.100
libavformat 58. 45.100 …
Run Code Online (Sandbox Code Playgroud) 我正在使用vp8 SDK(www.webmproject.org)创建一个vp8编码的视频文件.但是,SDK示例会生成一个IVF文件,浏览器不会播放该文件.
我知道WebM格式是Matroska的一种容器,所以我想我应该在视频数据存储在该格式,但MKV格式规范是漫长和复杂的,我不认为我应该由我自己想出来的推倒重来.
所以我想知道是否有人可以推荐一个如何编码和生成可播放的webm vp8文件的示例.如果没有这样的样品(如我在谷歌搜索建议)至少指向我这被证明为浏览器工作的简单和实用的Matroska库.
谁能告诉我元数据以常见的视频文件格式存储在哪里?如果它位于文件的开头,或分散在整个文件中.
我正在使用包含大量视频文件的远程对象存储,我想从这些文件中提取元数据,特别是视频持续时间和视频尺寸,而不将整个文件内容流式传输到本地计算机.
我希望这些元数据将存储在文件的前X个字节中,因此我可以从头开始而不是整个文件获取字节范围,将此部分文件数据传递给ffprobe
.
出于测试目的,我创建了一个22MB的MP4文件,并使用以下命令仅向ffprobe提供前1MB的数据:
head -c1024K '2013-07-04 12.20.07.mp4' | ffprobe -
Run Code Online (Sandbox Code Playgroud)
它打印:
avprobe version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2007-2013 the Libav developers
built on Apr 2 2013 17:02:36 with gcc 4.6.3
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x1a6b7a0] stream 0, offset 0x10beab: partial file
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'pipe:':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 1947-07-04 11:20:07
Duration: 00:00:09.84, start: 0.000000, bitrate: N/A
Stream #0.0(eng): Video: h264 (High), yuv420p, 1920x1080, 20028 kb/s, PAR 65536:65536 DAR 16:9, 29.99 fps, …
Run Code Online (Sandbox Code Playgroud) 对于录制音频和视频,我下创建WebM文件ondataavailable的MediaRecorder API。我必须单独播放每个创建的 webm 文件。
Mediarecorder api 仅将标头信息插入到第一个块(webm 文件)中,因此其余块在没有标头信息的情况下不会单独播放。
作为建议的链接 1和链接 2,我从第一个块中提取了标头信息,
// for the most regular webm files, the header information exists
// between 0 to 189 Uint8 array elements
const headerIinformation = arrayBufferFirstChunk.slice(0, 189);
Run Code Online (Sandbox Code Playgroud)
并将这个header信息附加到第二个chunk中,第二个chunk还是不能播放,但是这次浏览器显示的是视频的海报(单帧)和两个chunk之和的时长,例如:10秒;每个块的持续时间为 5 秒。
我用十六进制编辑器做的同样的标题信息事情。我在编辑器中打开了 webm 文件,从第一个 webm 文件中复制了前 190 个元素并将其放入第二个文件中,如下图所示,即使这次,第二个 webm 文件也无法播放,结果与前面的示例相同。
红色显示标题信息:
这次我从第一个 webm 文件中复制了标题和集群信息并将其放入第二个文件中,如下图所示,但没有成功,
问题
我在这里做错了什么?
有什么办法可以单独播放 webm 文件/块吗?
注意:我不能使用MediaSource来播放这些块。
编辑 1
正如@Brad 建议的那样,我想将第一个集群之前的所有内容插入到后面的集群中。我有几个 webm 文件,每个文件的持续时间为 5 秒。深入研究文件后,我才知道,几乎每个备用文件都没有聚集点(没有 0x1F43B675)。
在这里我很困惑,我必须在每个文件的开头或每个第一个集群的开头插入头信息(初始化数据)?如果我选择稍后的选项,那么没有任何集群的webm文件将如何播放?
或者,首先我需要以一种一开始就具有集群的方式制作每个 webm 文件,这样我就可以在这些文件中的集群之前添加标头信息?
编辑 …
如何在C#(或C或C++或AS3)中读取MKV电影文件的元数据?
例如这样的
creator
metadatacreator
hasKeyframes
hasVideo
hasAudio
hasMetaData
canSeekToEnd
duration
datasize
videosize
videocodecid
audiosize
audiocodecid
audiosamplerate
audiosamplesize
stereo
filesize
lasttimestamp
lastkeyframetimestamp
lastkeyframelocation
keyframes (filepositions, times)
width
height
framerate
videodatarate
audiodatarate
Run Code Online (Sandbox Code Playgroud) 能够将mkv文件转储到某些文本(如in mkvinfo -v
),编辑它并重新构建,将二进制数据保留为十六进制转储是很有用的.
就像是:
$ mkv2xml < test.mkv > test.xml
$ head test.xml
<EBML>
<EBMLVersion>1</EBMLVersion>
<MaxIdLen>4</<MaxIdLen>
<MaxSizeLen>8</MaxSizeLen>
<DocType>matroska</DocType>
<DocTypeVersion>2</DocTypeVersion>
<DocTypeReadVersion>2</DocTypeReadVersion>
<Segment>
<Tracks>
<Track>
<TrackNumber>1</TrackNumber>
<CodecID>V_MJPEG</CodecID>
<Video><PixelWidth>320</PixelWidth><PixelHeight>240</PixelHeight></Video>
</Track>
</Tracks>
<Cluster>
<Timecode>5.023</TimeCode>
<SimpleBlock track="1" time="5.045">
ffd8fffe001a80......
$ xml2mkv < test.xml | mplayer -cache 100 -
Run Code Online (Sandbox Code Playgroud)
这有助于简化编写[调试]工具与视频一起工作,而无需实际处理多路复用/多路分解细节,只需查看输出即可.
在使用以下 ffmpeg 选项进行屏幕录制时,我始终在视频之前获得音频,延迟约为几秒钟
ffmpeg 命令:
ffmpeg -y -f x11grab -thread_queue_size 1024 -draw_mouse 0 -video_size 1920x1080 -i :0 -f pulse -thread_queue_size 1024 -i default -c:v libx264 -threads 0 -preset faster -c:a flac -async 1 -vsync 1 -crf 30 -crf_max 33 -f matroska output.mkv
ffprobe 输出如下:
$ ffprobe demo.mkv
ffprobe version 3.4.4-1~16.04.york0 Copyright (c) 2007-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
configuration: --prefix=/usr --extra-version='1~16.04.york0' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass …
Run Code Online (Sandbox Code Playgroud) 我想做的是使用 webRTC 对浏览器中录制的视频进行实时转录。用例基本上是实时字幕,就像谷歌环聊一样。
所以我有一个WebRTC程序在浏览器中运行。它将 webm 对象发送回服务器。它们是线性32 音频编码。Google 语音转文本仅接受 Linear16 或 Flac 文件。
有没有办法将线性32实时转换为线性16?
否则,是否有人能够将 webRTC 与 Google 语音连接起来以实现实时转录?
任何关于在哪里寻找解决这个问题的建议都会很棒
我尝试播放以 h264 编码并使用 matroskamux 混合的视频,但无法实现。我使用的是嵌入式平台,iMX6。
我的管道适用于 gst-lauch:
gst-launch-1.0 filesrc location=video.mkv ! matroskademux ! h264parse ! imxvpudec ! imxipuvideosink
Run Code Online (Sandbox Code Playgroud)
我用C创建了它,但它不起作用。我删除了错误处理,我使用包含所有元素的结构rep
:
rep->pipeline = gst_pipeline_new("pipeline");
rep->src = gst_element_factory_make("filesrc","source0");
rep->demux = gst_element_factory_make("matroskademux","demux0");
rep->queue = gst_element_factory_make("queue2","queue0");
rep->parser = gst_element_factory_make("h264parse","parser0");
rep->decoder = gst_element_factory_make("imxvpudec","dec0");
rep->sink = gst_element_factory_make("imxipuvideosink","sink0");
gst_bin_add_many (GST_BIN(rep->pipeline), rep->src, rep->demux, rep->queue, rep->parser, rep->decoder,rep->sink, NULL);
g_object_set(rep->src, "location", "video.mkv", NULL);
g_object_set(rep->sink, "use-vsync", TRUE, NULL);
gst_element_link_many(rep->src, rep->demux, rep->queue, rep->parser, rep->decoder, rep->sink, NULL);
g_print("start pipeline\n");
gst_element_set_state (rep->pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
Run Code Online (Sandbox Code Playgroud)
视频不显示并且应用程序卡住。使用 GST_DEBUG=4 我得到了很多调试,但在最后几行:
0:00:00.168590667 577 0xe24c0 WARN matroskademux …
Run Code Online (Sandbox Code Playgroud)