Как создать сегмент видео (ffmpeg -ss -t) в GStreamer? gst_segment_do_seek: утверждение «сегмент->формат == формат» не вC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как создать сегмент видео (ffmpeg -ss -t) в GStreamer? gst_segment_do_seek: утверждение «сегмент->формат == формат» не в

Сообщение Anonymous »

С FFMPEG довольно легко создать видео -сегмент с опцией -SS и -T. Но это сложно с GSTREAMER. Мы должны написать программу (в C или Python) и вызвать GST_ELEMENT_SEEK, чтобы перейти к определенному времени. Однако такая программа не может быть легко реализована.
Давайте начнем. >
(этот файл часто используется в учебниках Gstreamer) < /p>
Конвертировать его в H264 /AAC: < /p>

Код: Выделить всё

ffmpeg -i sintel_trailer-480p.webm sintel_trailer-480p.mp4
< /code>
Открыть Visual Studio и создать простой проект командной строки с кодом ниже (main.c): < /p>
#include 

GMainLoop* loop = NULL;
GstElement* pipeline = NULL;

gboolean gst_bus_handler(GstBus* bus, GstMessage* message, gpointer data)
{
GstMessageType type = message->type;

if (type == GST_MESSAGE_EOS) {
g_main_loop_quit(loop);
}
else if (type == GST_MESSAGE_STATE_CHANGED) {
GstState old_state, new_state;
gst_message_parse_state_changed(message, &old_state, &new_state, NULL);
g_printerr(" - %s: %d => %d\n", message->src->name, old_state, new_state);

if (GST_MESSAGE_SRC(message) == GST_OBJECT_CAST(pipeline)) {
if (old_state != GST_STATE_PAUSED && new_state == GST_STATE_PAUSED) {
gst_element_seek(
pipeline, 1.0, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),
GST_SEEK_TYPE_SET, 12 * GST_SECOND,
GST_SEEK_TYPE_SET, 20 * GST_SECOND);
}
}
}
else if (type == GST_MESSAGE_ASYNC_DONE) {
gst_element_set_state(pipeline, GST_STATE_PLAYING);
}

return TRUE;
}

int main(int argc, char* argv[])
{
// SetEnvironmentVariable(L"GST_DEBUG", L"3");

gst_init(NULL, NULL);

// create the pipeline
#ifdef PLAY
pipeline = gst_parse_launch(
"filesrc location=sintel_trailer-480p.mp4 name=src ! qtdemux name=demux"
" demux.video_0 ! nvh264dec name=dec ! d3d11videosink name=sink", NULL);
#else
pipeline = gst_parse_launch(
"filesrc location=sintel_trailer-480p.mp4 name=src ! qtdemux name=demux"
" demux.video_0 ! nvh264dec name=dec ! nvh264enc name=enc ! h264parse name=parse ! mux.video_0"
" mp4mux name=mux ! filesink name=sink location=clip.mp4", NULL);
#endif
if (!pipeline) exit(-1);

// create the main loop
loop = g_main_loop_new(NULL, FALSE);

// set gst bus handler
GstBus* bus = gst_element_get_bus(pipeline);
guint watch_id = gst_bus_add_watch(bus, gst_bus_handler, NULL);
gst_object_unref(bus);

// preroll
GstStateChangeReturn ret = gst_element_set_state(pipeline, GST_STATE_PAUSED);
if (ret == GST_STATE_CHANGE_FAILURE) {
g_printerr("Unable to set the pipeline to the PAUSED state\n");
}
else {
g_main_loop_run(loop);
}

g_printerr("Setting pipeline state to NULL\n");
gst_element_set_state(pipeline, GST_STATE_NULL);
g_source_remove(watch_id);
g_main_loop_unref(loop);
g_printerr("Freeing pipeline\n");
gst_object_unref(pipeline);
gst_deinit();
return 0;
}
Есть макрос, который управляет этим режимом. В режиме PLAY программа воспроизводит видео с 00:00:12 до 00:00:20.
В режиме CONVERT программа пытается создать фрагмент видео с 00:00: с 12 по 00:00:20.
Воспроизведение работает нормально, но преобразование всегда завершается с ошибкой:
gst_segment_do_seek: assertion 'segment->format == format' failed
< /code>
Сценарий тестируется в Windows с GSTREAMER 1.24.11 (последний стабильный релиз). < /p>
Какой правильный способ создания видео -сегмента с GSTREAMER?

Подробнее здесь: https://stackoverflow.com/questions/793 ... nt-do-seek
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как создать сегмент видео (ffmpeg -ss -t) в GStreamer?
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Более четкая сегментация SAM (Segment Anything)
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как решить проблему с задержкой запуска видео gst-launch-1.0?
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • У меня есть проблема с моим аудиокодиком FFMPEG FFMPEG FFMPEG
    Anonymous » » в форуме C++
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как создать gst.buffer?
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»