微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

手动gstreamer HLS管道无法正常播放

如何解决手动gstreamer HLS管道无法正常播放

我的任务是使用gstreamer从jpeg帧创建HLS实时流。框架不断添加到我的临时目录(/ tmp / frames)。我不能使用hlssink插件,因为编码的运行速度比出现新帧的速度快,并且流水线停止的时间比到达最后一帧的时间还快。

所以我的解决方案是编写脚本,该脚本将使用简单的filesink插件并手动维护播放列表文件。在Python中看起来像这样:

# pipeline function
def convert_frames_to_video_pipeline(dir_of_frames: Path,start_frame_index: int,video_files_location: Path,frame_filename_template: typing.Text,video_file_num: int):
    filename = f"file{video_file_num}.mp4"
    frames_per_sec = 25
    omxh264_pipeline = f"gst-launch-1.0 multifilesrc location={dir_of_frames / frame_filename_template} start-index={start_frame_index} caps=\"image/jpeg,framerate={frames_per_sec}/1\" !" \
                " jpegdec ! videoconvert ! videorate ! omxh264enc ! h264parse ! mpegtsmux ! " \
                f" filesink location={video_files_location / filename}"
    compl_process = subprocess.run(omxh264_pipeline,shell=True)

    return filename
# maintain playlist file function
def update_playlist(filename: typing.Text,video_dir: Path,videofiles_names: typing.List,last_video_file_num: int):
    ext_x_version = 4
    videofile_duration = 4.
    
    # generate playlist file
    file_lines = ["#EXTM3U"]
    file_lines.append(f"#EXT-X-VERSION:{ext_x_version}")
    file_lines.append(f'#EXT-X-TARGETDURATION:{float(videofile_duration)}')
    file_lines.append(f'#EXT-X-MEDIA-SEQUENCE:{last_video_file_num - len(videofiles_names) + 1}')
    

    for videofile_name in videofiles_names:
        file_lines.append(f'#EXTINF:{float(videofile_duration)},')
        file_lines.append(videofile_name)

    with open(video_dir / filename,'w') as playlist_file:
        playlist_file.write('\n'.join(file_lines))

这两个函数每隔几秒钟运行一次,以为HLS生成新的mp4片段并更新播放列表文件。我从Apple official instructions获得的播放列表文件模板。播放列表示例如下:

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:4.0
#EXT-X-MEDIA-SEQUENCE:416
#EXTINF:4.0,file416.mp4
#EXTINF:4.0,file417.mp4
#EXTINF:4.0,file418.mp4
#EXTINF:4.0,file419.mp4
#EXTINF:4.0,file420.mp4

问题是我使用的所有播放器(HLS.js,VLC,MPV)都无法正确播放播放列表。他们播放某些片段,然后永久停止加载新片段。 HLS.js说 MP4 fragments found but no init segment (probably no MAP,incomplete M3U8),trying to fetch SIDX和MPV警告[ffmpeg/demuxer] mpegts: DTS 324108000 < 324172800 out of order [ffmpeg/demuxer] hls: DTS 324108000 < 324172800 out of orderInvalid video timestamp: 0.720000 -> 0.000000

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。