Невозможно воспроизвести видеофайл, записанный gstreamer

Я не могу воспроизвести видеофайл, записанный ранее самим gstreamer 1.9.

На данный момент у меня есть этот трубопровод:

для видео

appsrc! формат видео / x-raw = RGB, ширина = 800, высота = 400, частота кадров = 24/1! jpegenc! matroskamux! расположение файловой папки = c: \ gstreamer \ test.mkv

для субтитров (2 трека)

appsrc! text / x-raw format = utf8! matroskamux! расположение файловой папки = c: \ gstreamer \ test.mkv

Трубопровод строится поэлементно с использованием gst_element_factory_make, и связаны с использованием gst_element_link.

Когда мне нужно остановить запись, я звоню gst_element_send_event (_pipeline, gst_event_new_eos ());.

И остановка трубопровода gst_element_set_state (_pipeline, GST_STATE_NULL); только после того, как есть GST_MESSAGE_EOS событие в автобусе.

Но, когда я хочу проверить файл результатов по GST-Validate-1,0, у меня есть это:

C:\gstreamer\1.0\x86\bin>gst-validate-1.0 filesrc location=C:\\Video\\test.mkv ! matroskademux name=mux mux.video_0! jpegdec ! autovideosink
WARNING: no real random source present!
Starting pipeline
Pipeline started
warning : EOS received without segment event before
Detected on <jpegdec0:src>
Description : A segment event should always be sent before data flow EOS being some kind of data flow, there is no exception in that regard

issue : EOS events that are part of the same pipeline 'operation' should have the same seqnum
Detected on <mux:video_0>
Detected on <jpegdec0:sink>
Description : when events/messages are created from another event/message, they should have their seqnums set to the original event/message seqnum

critical : We got an ERROR message on the bus
Detected on <pipeline0>==== Got criticals, Return value set to 18 ====
Critical error Got error: Internal data stream error. -- Debug message: matroska-demux.c(4759): gst_matroska_demux_loop (): /GstPipeline:pipeline0/GstMatro
skaDemux:mux:
streaming stopped, reason not-negotiated (-4)

Issues found: 3
Returning 18 as error where found
=======> Test FAILED (Return value: 18)

Я тоже пытался отправить событие конца сегмента, но безуспешно. Я не вижу этого в автобусе.

Я делаю что-то не так в записи или воспроизведении?

Можете ли вы помочь мне решить мою проблему, пожалуйста.

Мой исходный код для записи. Это добыча. Могут быть небольшие ошибки. Сожалею.
Вам также нужен код для воспроизведения? Это не работает вообще.

class GStreamerRecorder
{

GstElement* _pipeline = nullptr;
GstElement* _videoSource = nullptr;
GstElement* _videoFilter = nullptr;
GstCaps* _videoFormat = nullptr;
GstElement* _container = nullptr;
GstElement* _recorder = nullptr;

void init()
{
//init gstreamer library
gst_init(nullptr, nullptr);//init papeline
_pipeline = gst_pipeline_new("VideoRecorder");
if (!_pipeline){throw 1;}

//init video source
_videoSource = gst_element_factory_make("videotestsrc", "VideoFrame");//appsrc videotestsrc
if (!_videoSource){throw 2;}

//init video filter
_videoFilter = gst_element_factory_make("capsfilter", "VideoFilter");
if (!_videoFilter){throw 2;}

_videoFormat = gst_caps_new_simple("video/x-raw",
"format", G_TYPE_STRING, "RGB",
"width", G_TYPE_INT, 800,
"height", G_TYPE_INT, 400,
"framerate", GST_TYPE_FRACTION, 24, 1,
NULL);
g_object_set(G_OBJECT(_videoFilter), "caps", _videoFormat, NULL);

//init video container
_container = gst_element_factory_make("matroskamux", "Container"); //matroskamux avimux
if (!_container){throw 3;}

//init file recording
_recorder = gst_element_factory_make("filesink", "Recorder");
if (!_recorder){throw 4;}
//set file name
g_object_set(_recorder, "location","c:\\videoid\\gstreamer\\test.mkv", NULL);

//build the pipeline
gst_bin_add_many(GST_BIN(_pipeline), _videoSource, _videoFilter, _container, _recorder, NULL);

//link elemets
if ((bool)gst_element_link(_videoSource, _videoFilter) != true) { throw 5; }
if ((bool)gst_element_link(_videoFilter, _container) != true) { throw 5; }
if ((bool)gst_element_link(_container, _recorder) != true) { throw 5; }

//start recording
GstStateChangeReturn status;
status = gst_element_set_state(_pipeline, GST_STATE_PLAYING);
if (status == GST_STATE_CHANGE_FAILURE){throw 1;}
}

void AddFrame(GstElement* destination, unsigned char* data, int size, int offset, int duration)
{
GstBuffer* buffer= gst_buffer_new_allocate(NULL, size, NULL);
GST_BUFFER_PTS(result) = offset;
GST_BUFFER_DURATION(result) = duration;

//fill buffer with data
gst_buffer_fill(buffer, 0, data, size);

//push video buffer to file
GstFlowReturn ret;
g_signal_emit_by_name(destination, "push-buffer", buffer, &ret);
}

void StopVideoFile()
{
//register call back function for soft stop
GstBus* bus = gst_pipeline_get_bus(GST_PIPELINE(_pipeline));
gst_bus_add_watch(bus, BusCallback, _loop);
//gst_bus_add_signal_watch(bus);

//send soft stop signal
gst_element_send_event(_pipeline, gst_event_new_eos());

//activate main loop
g_main_loop_run(_loop);

//stop recording
gst_element_set_state(_pipeline, GST_STATE_NULL);

_pipeline = nullptr;
}

int GStreamerRecorder::BusCallback(GstBus* bus, GstMessage* message, void* loop)
{
switch (GST_MESSAGE_TYPE(message))
{
case GST_MESSAGE_ERROR:
break;

case GST_MESSAGE_EOS:

g_main_loop_quit((GMainLoop *)loop);

return false;

break;

}
return TRUE;
}
};

Результатом gst-discoverer-1.0 -v C: \ Video \ test.mkv является

Analyzing file:///C://video//test.mkv
Done discovering file:///C://video//test.mkv

Topology:
container: video/x-matroska
subtitles: text/x-raw, format=(string)pango-markup
Tags:
container format: Matroska
language code: en

Codec:
text/x-raw, format=(string)pango-markup
Additional info:
None
Stream ID: b4368b8a0fa3b45cffd297ed75944d7e99b0c7abc7e93a406c4ee970c8d97ac5/003:16476197871654839755
Language: en
subtitles: text/x-raw, format=(string)pango-markup
Tags:
container format: Matroska
language code: en

Codec:
text/x-raw, format=(string)pango-markup
Additional info:
None
Stream ID: b4368b8a0fa3b45cffd297ed75944d7e99b0c7abc7e93a406c4ee970c8d97ac5/002:17212272217086422368
Language: en
video: image/jpeg, framerate=(fraction)4/1, width=(int)900, height=(int)800
Tags:
container format: Matroska
video codec: Motion JPEG

Codec:
image/jpeg, framerate=(fraction)4/1, width=(int)900, height=(int)800
Additional info:
None
Stream ID: b4368b8a0fa3b45cffd297ed75944d7e99b0c7abc7e93a406c4ee970c8d97ac5/001:380798365750797811
Width: 900
Height: 800
Depth: 24
Frame rate: 4/1
Pixel aspect ratio: 1/1
Interlaced: false
Bitrate: 0
Max bitrate: 0

Properties:
Duration: 0:00:38.250000000
Seekable: yes
Tags:
container format: Matroska
language code: en
video codec: Motion JPEG

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]