使用传输流缓冲区生成 mpeg-dash 片段和 mpd 文件

使用传输流缓冲区生成 mpeg-dash 片段和 mpd 文件

我正在缓冲区上接收 mpeg-2 传输流,并且需要使用 HTTP 将内容提供给 Web 视图。

我打算使用 mpeg-dash 规范和一个简单的 HTTP 服务器来实现它。一种方法是自己解析传输流数据包并生成相应的直播片段和 mpd 文件,但这似乎是一个漫长的过程。

我已经尝试过 mp4box 和 ffmpeg 等工具,它们能够使用静态媒体文件生成 dash 兼容片段,但对于初学者来说,文档不够清晰。

是否有任何简单的方法可以使用缓冲传输流作为输入(可能通过管道)来实时生成 dash 内容(到服务器的根文件夹)。

如果有更好的方法请告诉我。您认为自己解析传输流数据包是更好的选择吗?

答案1

FFMPEG 可以从管道而不是文件读取,其中-pipe:N“N”是文件描述符。

为了从 shell 进行测试,您可以获取cat一个文件并将其传送到 FFMPEG。如下所示:

cat someFile.ts | ffmpeg -re -loglevel verbose -f mpegts \
  -i pipe:0 \
  -map 0:p:8 \
  -filter_complex [v:0]scale=640:-1 \
  -c:v libx264 -b:v 1M -c:a aac -b:a 64k \
  -f dash \
   -dash_segment_type mp4 -movflags +delay_moov -seg_duration 2.000000 \
   -frag_type duration -frag_duration 0.200000 \
   -index_correction 1 \
   -target_latency 1 -window_size 10 -extra_window_size 5 -remove_at_exit 1 -streaming 1 -ldash 1 \
   -use_template 1 -use_timeline 0 -write_prft 1 -avioflags direct -fflags +nobuffer+flush_packets \
   -format_options movflags=+cmaf \
   -utc_timing_url /myServer/time.php  \
   /path/to/master.mpd

如果您的 TS 文件有多个程序 (MPTS),请使用-map并指定程序。如果您还要缩放,请确保指定程序!

如果您想在程序中完成所有这些操作,那么:

使用 分叉一个单独的进程fork(),使用 在进程之间创建一个管道pipe,并使用 或类似方法调用 FFMPEG execv()

传递给 FFMPEG 命令行exec()必须指定读边管道。例如,-pipe:9(或其他)

在父进程中,从源(文件或网络)读取 TS 数据块并写入写方管道。

FFMPEG 将读取管道并创建 MPD 和块文件。

相关内容