[Vlc库在C和Ubuntu中使用fork()时失败

问题描述 投票:-1回答:1

我不明白为什么我总是出现此错误:

    ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave
[00005617d3cf0630] alsa audio output error: cannot open ALSA device "default": No such file or directory
[00005617d3cf0630] main audio output error: Audio output failed
[00005617d3cf0630] main audio output error: The audio device "default" could not be used:
No such file or directory.
[00005617d3cf0630] main audio output error: module not functional
[00007f2ce803b080] main decoder error: failed to create audio output

当我尝试使用fork()复制mp3文件时。

如果我在fork()之外使用它,则代码可以正常工作。子进程似乎无法访问硬件声卡?我真的不明白如何解决该问题。

pid = fork();
     printf("il pid: %d\n", pid);
     if (pid == 0) {
         libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;

    // load the vlc engine
    inst = libvlc_new(0, NULL);
    printf("apro il file \n");
    // create a new item
    m = libvlc_media_new_path(inst, "/home/robodyne/Downloads/file.mp3");

    // create a media play playing environment
    mp = libvlc_media_player_new_from_media(m);

    // no need to keep the media now
    libvlc_media_release(m);

    // play the media_player
    libvlc_media_player_play(mp);

    sleep(10);

    // stop playing
    libvlc_media_player_stop(mp);

    // free the media_player
    libvlc_media_player_release(mp);

    libvlc_release(inst);

        exit(0);
}

EDIT1:我正在尝试使用THREADS

[按照Antti Haapala的建议,我尝试使用线程而不是fork(),但是当我调用“ pthread_cancel(thread);”时,mp3不会停止。

这是我的新代码:

pthread_t thread;

void *wait(void*)
{
    libvlc_instance_t *inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;
    // load the vlc engine
    inst = libvlc_new(0, NULL);
    printf("apro il file %d\n", inst);
    // create a new item
    m = libvlc_media_new_path(inst, "/home/robodyne/Downloads/file.mp3");
    // create a media play playing environment
    mp = libvlc_media_player_new_from_media(m);
    // no need to keep the media now
    libvlc_media_release(m);

    // play the media_player
    libvlc_media_player_play(mp);

    sleep(10);
    // stop playing
    libvlc_media_player_stop(mp);
    // free the media_player
    libvlc_media_player_release(mp);
    libvlc_release(inst);


    printf("Done.\n");
}
SecondPage::SecondPage(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(SecondPage)
    Create(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
    SetClientSize(wxSize(1314,769));
    SetBackgroundColour(wxColour(175,253,202));
    // some code from wxwidgets removed


    m_reboot.Bind(wxEVT_TIMER, &SecondPage::Reboot, this);

     if (get_day_of_year() == 2 || get_day_of_year() == 4){
        secco->Show();
     }

     pthread_create(&thread, NULL, wait, NULL);
}

void SecondPage::OnplasticaClick(wxCommandEvent& event)
{
    pthread_cancel(thread);

    thirdpage = new ThirdPage(nullptr, 2);
    thirdpage->selezione="plastica";
    strcpy(thirdpage->codice_fiscale, codice_fiscale);
    thirdpage->tipologia_rifiuto->SetLabel(thirdpage->selezione);
    thirdpage->Refresh();
    thirdpage->Update();
    thirdpage->m_reboot.StartOnce(600000);
    thirdpage->Show(true);
    this->Hide();
}
c ubuntu fork libvlc
1个回答
3
投票
在多线程程序中,

A fork从不

© www.soinside.com 2019 - 2024. All rights reserved.