Я пытаюсь показать прямую трансляцию с веб-камеры и одновременно записать видео и аудио в видеофайл. Я не уверен, что все делаю правильно. Я пытался использовать код расплава как способ начать. Одной из проблем является то, что подача очень задерживается (я бы на самом деле хотел, чтобы выбор был для пользователей, х секунд задержки или без задержки). Во-вторых, когда я закрываю потребителя, программа в основном падает, веб-камера никогда не закрывается, и ffmpeg выводит на консоль следующие строки (без остановок)
[dshow @ 16edf960] real-time buffer [Integrated Camera]
too full or near too full (121% of size: 3041280 [rtbufsize
parameter])! frame dropped!
Я использую QT для моего интерфейса и остальной части программы. Мой код выглядит следующим образом:
m_profile = new Mlt::Profile(profile);
m_producer = new Mlt::Producer(*m_profile, "dshow:video=Integrated Camera:audio=Microfone interno (Conexant 206");
if (!m_producer->is_valid()) {
// Cleanup on error
error = 1;
delete m_producer;
m_producer = 0;
delete m_profile;
m_profile = 0;
}
else {
m_consumer = new Mlt::Consumer(*m_profile, "multi");
if (m_consumer->is_valid()) {
mlt_properties properties = m_consumer->get_properties();
QWidget* widget = qobject_cast<QWidget*>(parent());
mlt_properties new_props1 = mlt_properties_new();
mlt_properties new_props2 = mlt_properties_new();
mlt_properties_set_data(properties, "0", new_props1, 0, (mlt_destructor) mlt_properties_close, NULL);
mlt_properties_set_data(properties, "1", new_props2, 0, (mlt_destructor) mlt_properties_close, NULL);
mlt_properties_set(new_props1, "mlt_service", "sdl_preview");
mlt_properties_set_int(new_props1, "window_id", (int) widget->winId());
mlt_properties_set_int(new_props1, "audio_off", 1);
mlt_properties_set_int(new_props1, "real_time", 1);
mlt_properties_set(new_props2, "mlt_service", "avformat");
mlt_properties_set(new_props2, "target", "out.mp4");
mlt_properties_set_int(new_props2, "terminate_on_pause", 0);
mlt_properties_set_int(new_props2, "real_time", 1);
m_consumer->connect(*m_producer);
//Make an event handler for when a frame's image should be displayed
m_consumer->listen("consumer-frame-show", this, (mlt_listener)on_frame_show);
m_consumer->start();
m_consumer->debug("Consumer");
m_producer->debug("Producer");
}
Если я попытаюсь просто показать канал (m_consumer = new Mlt::Consumer(*m_profile, "sdl_preview");
) задержка все еще есть, но я могу нормально закрыть ее. То же самое для записи (m_consumer = new Mlt::Consumer(*m_profile, "avformat:out.mp4");
). Закрывается нормально и файл работает. Я также попробовал двух потребителей для одного производителя, и, несмотря на множество артефактов и отсутствующий звук, он работает, и я могу закрыть файл и камеру. Но не похоже, что он ведет себя очень хорошо с двумя потребителями для одного производителя.
Это вопрос настроек? Или это ограничение по млт?
Задача ещё не решена.