python - 有没有办法使用 vlc python 模块播放加载到内存的视频

标签 python video module vlc playback

我试图利用 VLC python 模块在将文件读入内存后播放文件。我有以下代码将有效的视频文件读取到内存中。我现在需要直接从内存中播放视频。

import vlc
File1 = open('vid.webm','rb')
Axel  = File1.read()

现在我需要播放Axel中的内容,我该怎么做。

最佳答案

您可以引用下面的代码。

# -*- coding: utf-8 -*-

import ctypes
import io
import sys
import time

import vlc

MediaOpenCb = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p), ctypes.POINTER(ctypes.c_uint64))
MediaReadCb = ctypes.CFUNCTYPE(ctypes.c_ssize_t, ctypes.c_void_p, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t)
MediaSeekCb = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_void_p, ctypes.c_uint64)
MediaCloseCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p)


def media_open_cb(opaque, data_pointer, size_pointer):
    data_pointer.contents.value = opaque
    size_pointer.contents.value = sys.maxsize
    return 0


def media_read_cb(opaque, buffer, length):
    stream=ctypes.cast(opaque,ctypes.POINTER(ctypes.py_object)).contents.value
    new_data = stream.read(length)
    for i in range(len(new_data)):
        buffer[i]=new_data[i]
    return len(new_data)


def media_seek_cb(opaque, offset):
    stream=ctypes.cast(opaque,ctypes.POINTER(ctypes.py_object)).contents.value
    stream.seek(offset)
    return 0


def media_close_cb(opaque):
    stream=ctypes.cast(opaque,ctypes.POINTER(ctypes.py_object)).contents.value
    stream.close()


callbacks = {
    'open': MediaOpenCb(media_open_cb),
    'read': MediaReadCb(media_read_cb),
    'seek': MediaSeekCb(media_seek_cb),
    'close': MediaCloseCb(media_close_cb)
}

def MediaPlayerTimeChanged(event, userData):
  print event.u.new_time

def main(stream):
    instance = vlc.Instance()
    player = instance.media_player_new()
    vlc_events = player.event_manager()
    vlc_events.event_attach(vlc.EventType.MediaPlayerTimeChanged, MediaPlayerTimeChanged, None)
    media = instance.media_new_callbacks(callbacks['open'], callbacks['read'], callbacks['seek'], callbacks['close'], ctypes.cast(ctypes.pointer(ctypes.py_object(stream)), ctypes.c_void_p))
    player.set_media(media)

    player.play()

    while True:
        time.sleep(1)

if __name__ == '__main__':
    try:
        path = "d:/1.mp4"
        stream = open(path, 'rb')
        main(stream)
    except IndexError:
        print('Usage: {0} <path>'.format(__file__))
        sys.exit(1)

关于python - 有没有办法使用 vlc python 模块播放加载到内存的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51696679/

相关文章:

android - 以编程方式暂停媒体记录器。来自三星银河的 Camera.apk 有 `this.mMediaRecorder.pause();` 在我的代码中不起作用

audio - ffmpeg水平翻转视频

python - 在 python 中,如果一个模块调用另一个模块的函数,该函数是否可以访问第一个模块的文件路径?

python - 如何使用 boto3 将 S3 对象保存到文件中

python - 如何多次动态调用命令的子命令?

Python3 + Gunicon 19.9 + Django 2.0 不打印我的日志,但打印 django.request

image - 如何轻松识别流是视频还是图片【ffmpeg库】

python-3.x - 从同级目录导入 - Python 3.7

xml - Magento 布局 XML 文件覆盖

python - Instagram api 不返回数据