muxer на python

Как попростому упаковать h264 в mp4 контейнер для стрима в html5?

Тащить целый ffmpeg как-то не хочется, да ещё и источник и приемник будут асинхронными.

gst_app_sink_pull_sample блокирует...


Поставил asyncio_glib, сигнал на выходе не выполняется... хотя await должен тут отработать сигналы asyncio_glib..

import asyncio
import asyncio_glib
asyncio.set_event_loop_policy(asyncio_glib.GLibEventLoopPolicy())
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst
Gst.init(None)

...

src_v = Gst.ElementFactory.make("appsrc")
src_v.set_property('caps', Gst.Caps.from_string('video/h264'))

videoparse = Gst.ElementFactory.make('rawvideoparse')
mp4mux = Gst.ElementFactory.make("mp4mux", "mux")
sink = Gst.ElementFactory.make("appsink", "sink")
src_v.set_property("emit-signals", True)
sink.set_property("emit-signals", True)
pipeline = Gst.Pipeline()

pipeline.add(src_v)
pipeline.add(videoparse)
pipeline.add(mp4mux)
pipeline.add(sink)

src_v.link(videoparse)
videoparse.link(mp4mux)
mp4mux.link(sink)

def new_buffer(sink, userdata):
    print('new_buffer')
    sample = sink.emit("pull-sample")
    buf = sample.get_buffer()
    (result, mapinfo) = buf.map(Gst.MapFlags.READ)
    userdata.write(mapinfo.data)
    buf.unmap(mapinfo)
    return Gst.FlowReturn.OK

sink.connect("new-sample", new_buffer, of)
pipeline.set_state(Gst.State.PLAYING)

while True:
    data = await reader.read(32768)
    print(rotating(), end="\r", flush=True)
    if not data:
        src_v.emit("end-of-stream")
        break
    else:
        buf = Gst.Buffer.new_allocate(None, len(data), None)
        buf.fill(0, data)
        src_v.emit("push-buffer", buf)

Ответы (1 шт):

Автор решения: Limon

Почему у вас вместо h264parse стоит rawvideoparse если видео video/h264?

Как вариант - попробовать собрать цепочку в консоли с использованием

gst-launch-1.0 filesrc ! h264parse ! mp4mux ! fdsink и посмотреть будут ли падать буфера в консоль.

В коде удобнее использовать:

pipe = Gst.parse_launch('filesrc ! h264parse ! mp4mux ! fdsink name=sink')

sink = pipe.get_child_by_name('sink')

sink.connect(...)
→ Ссылка