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(...)