我正在缓冲区上接收 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 和块文件。