2

ウェブカメラからライブ フィードを表示し、同時にビデオとオーディオをビデオ ファイルに記録しようとしています。私は物事を正しく行っているかどうかわかりません。開始方法としてメルトコードを使用しようとしました。問題の 1 つは、フィードが非常に遅れていることです (実際には、x 秒の遅延または遅延なしのいずれかをユーザーが選択できるようにしたいと考えています)。2番目は、コンシューマーを閉じると、プログラムが基本的にクラッシュし、Webカメラが閉じず、ffmpegがコンソールに次の行を出力します(ノンストップ)

[dshow @ 16edf960] real-time buffer [Integrated Camera] [video input]
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");)。通常どおり閉じ、ファイルは機能します。また、1 つのプロデューサーに対して 2 つのコンシューマーを試してみました。多くのアーティファクトと欠落したサウンドにもかかわらず、動作し、ファイルとカメラを閉じることができます。しかし、1 つのプロデューサーに対して 2 つのコンシューマーを使用すると、うまく動作しないようです。

これは設定の問題ですか?それともmltの制限ですか?

4

0 に答える 0