Проблема чтения файлов сегмента HLS в OpenCV VideoCapture: ошибка чтения заголовка - PullRequest
0 голосов
/ 10 января 2019

Я получаю сообщение об ошибке ниже при чтении файлов сегмента HLS (HTTP Live Streaming) в OpenCV, используя cv2.VideoCapture()


    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f941f2ca200] could not find corresponding trex
    [mov,mp4,m4a,3gp,3g2,mj2 @ 0x7f941f2ca200] error reading header

Сегментные файлы - mp4, а HLS-сервер - Amazon Kinesis Video Stream. Сообщение об ошибке говорит, что я пропускаю часть заголовка mp4, и это выглядит как-то разумно, потому что HLS предоставляет последовательность файлов.

Мой вопрос здесь заключается в том, что чтение сегментов HLS в OpenCV - это совершенно неправильный подход? или у нас есть обходной путь?


    import boto3
    import cv2
    import requests
    import re

    kinesis_client = boto3.client('kinesisvideo',
                                  region_name='ap-northeast-1'
                                  )

    endpoint = kinesis_client.get_data_endpoint(
        StreamARN='MY_ARN',
        APIName='GET_HLS_STREAMING_SESSION_URL'
    )

    data_endpoint = endpoint['DataEndpoint']
    url_prefix = data_endpoint + "/hls/v1/"

    video_client = boto3.client('kinesis-video-archived-media',
                                endpoint_url=data_endpoint
                                )

    # Retrieve HLS manifest URL from Kinesis Video Stream
    session_url = video_client.get_hls_streaming_session_url(
        StreamARN='MY_ARN',
        HLSFragmentSelector={'FragmentSelectorType': 'PRODUCER_TIMESTAMP'}
    )

    session_url = session_url['HLSStreamingSessionURL']

    # Fetch segment(mp4) file urls
    master_playlist = requests.get(session_url)
    media_playlist_url = url_prefix + master_playlist.text.split("\n")[-2]
    media_playlist = requests.get(media_playlist_url)
    media_playlist = media_playlist.text
    pattern = r"getMP4Media"
    segments  = filter(lambda x: re.match(pattern,x), media_playlist.split("\n"))

    for segment in segments:
      segment_url = url_prefix + segment

      # Debug segment url
      # This emits something like: https://b-87178fb5.kinesisvideo.ap-northeast-1.amazonaws.com/hls/v1/getMP4MediaFragment.mp4?FragmentNumber=91343852333186478711651164912799448912305946338&SessionToken=CiAFReSdi9NKKz8vDum-Bs_8MFJ-5jIk06WmiyKDQQazihIQLdLPLuvr6scwc4HhAo6uDRoZWbgLHyJK01pTzFujc-cSkfl0oo4pIFD2sSIghdfInJL4XqMc_brBoLCikS73I3Nxxxxxxxxxxx
      print(segment_url)


      # Read mp4 file from Kinesis Video Sterams
      cap = cv2.VideoCapture(segment_url)

      while(cap.isOpened()):
        ret, frame = cap.read()
        cv2.imshow("Frame",frame)

      cap.release()

...