如何播放GStreamer multifilesink生成的TS分片文件?
解决TS片段文件的播放问题
问题原因
你保存的这些.ts文件里,只有frame0.ts包含H.264编码必需的SPS/PPS序列参数集(解码初始化信息),后续的frame*.ts仅存储单帧或连续帧的编码数据,没有初始化信息,所以播放器无法单独解码这些文件;而VLC批量选择文件时是逐个播放而非拼接流,自然也无法正常播放。
解决方案
1. 用GStreamer直接按顺序播放所有片段
利用GStreamer的multifilesrc元素按序号读取文件并拼接成完整流播放,执行以下命令:
gst-launch-1.0 multifilesrc location=multisrc/frame%d.ts index=0 caps="application/x-mpegts" ! tsdemux ! h264parse ! vaapidecode ! autovideosink
multifilesrc location=multisrc/frame%d.ts index=0:从frame0.ts开始按序号读取所有片段- 后续元素负责TS解复用、H.264解析、硬件解码(vaapidecode)和视频输出
2. 合并所有片段为完整TS文件后播放
TS流支持直接拼接,先按正确顺序合并文件,再用任意播放器播放:
# 按版本号排序(确保frame10在frame100之前)并合并 ls multisrc/frame*.ts | sort -V | xargs cat > full_video.ts
合并完成后,直接用VLC打开full_video.ts,或者用GStreamer播放:
gst-launch-1.0 playbin uri=file:///path/to/full_video.ts
3. 单独播放某个中间片段
如果需要单独播放某一个中间文件(比如frame100.ts),需要先把包含初始化信息的frame0.ts和目标文件拼接:
cat multisrc/frame0.ts multisrc/frame100.ts > playable_frame100.ts
之后就可以用VLC或GStreamer播放playable_frame100.ts了。
内容的提问来源于stack exchange,提问作者lei lei
相关产品推荐
相关产品推荐

