为什么 DASH 视频片段无法使用 ffmpeg 重现或读取?

Why DASH video fragments are not reproducible nor readable with ffmpeg?

我正在通过 FFmpeg 使用 DASH 流式传输实时视频。一切正常,片段生成,mpd文件,但我想有可重现的独立片段。视频播放器不会打开这些片段。我想这是因为它们依赖于 mpd 文件。我的问题是:这些片段能否以可重现的方式生成?我不知道它是否与 I P B 帧有关,或者只是破折号切割视频信息的方式,在某种程度上它只在 mpd 上保存 'timeline'...

我的目的不仅是能够单独复制它们,而且我需要在视频的元数据标签中插入信息,而 ffmpeg 不会让我读取那些直播生成的片段。

FFmpeg 输入信息命令的行为如下:

输入:

ffmpeg -i /path/video0-0-1.mp4

输出:

ffmpeg version N-97777-g3b5a36c56d Copyright (c) 2000-2020 the FFmpeg developers
  built with Apple clang version 11.0.3 (clang-1103.0.32.59)
  configuration: --enable-gpl --enable-libx264
  libavutil      56. 45.100 / 56. 45.100
  libavcodec     58. 84.100 / 58. 84.100
  libavformat    58. 43.100 / 58. 43.100
  libavdevice    58.  9.103 / 58.  9.103
  libavfilter     7. 81.100 /  7. 81.100
  libswscale      5.  6.101 /  5.  6.101
  libswresample   3.  6.100 /  3.  6.100
  libpostproc    55.  6.100 / 55.  6.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb324009400] could not find corresponding track id 1
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb324009400] could not find corresponding trex (id 1)
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb324009400] could not find corresponding track id 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb324009400] trun track id unknown, no tfhd was found
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x7fb324009400] error reading header
/path/video0-0-1.mp4: Invalid data found when processing input

我在 JS 上使用 fluent-ffmpeg 执行此 FFmpeg 代码以生成片段:

var ffmpeg = require('fluent-ffmpeg');

var grabacion = new ffmpeg();

grabacion.addInput('0')
.inputOptions(['-y -nostdin', '-f avfoundation', '-video_size 1280x720', '-pix_fmt nv12', '-framerate 30'])
.outputOptions(['-vcodec libx264', '-keyint_min 0', '-g 100', '-map 0:v', '-b:v 1000k', '-f dash',
 '-use_template 1', '-use_timeline 0', '-init_seg_name video0-$RepresentationID$-$Number$.mp4',
 '-media_seg_name video0-$RepresentationID$-$Number$.mp4', '-remove_at_exit 0', '-window_size 20', '-seg_duration 4'])
.output('/path/path/path/video.mpd')
.run();

因此,最终目的是能够插入这样的标签:

ffmpeg -i video0-0-0.mp4 -movflags use_metadata_tags -metadata sample_tag=whateveryouwanttoadd video0-0-0-tagged.mp4

有什么办法吗?提前致谢!

通常DASH中的第一段是包含轨道信息的初始化段。所有后续片段都包含媒体样本。因此,如果您想解码任意段,则必须在其前面加上初始化段。

cat /path/video0-0-init.mp4 /path/video0-0-1.mp4 > /path/video_can_be_decoded.mp4
ffmpeg -i /path/video_can_be_decoded.mp4