
Recherche avancée
Autres articles (45)
-
Récupération d’informations sur le site maître à l’installation d’une instance
26 novembre 2010, parUtilité
Sur le site principal, une instance de mutualisation est définie par plusieurs choses : Les données dans la table spip_mutus ; Son logo ; Son auteur principal (id_admin dans la table spip_mutus correspondant à un id_auteur de la table spip_auteurs)qui sera le seul à pouvoir créer définitivement l’instance de mutualisation ;
Il peut donc être tout à fait judicieux de vouloir récupérer certaines de ces informations afin de compléter l’installation d’une instance pour, par exemple : récupérer le (...) -
Les tâches Cron régulières de la ferme
1er décembre 2010, parLa gestion de la ferme passe par l’exécution à intervalle régulier de plusieurs tâches répétitives dites Cron.
Le super Cron (gestion_mutu_super_cron)
Cette tâche, planifiée chaque minute, a pour simple effet d’appeler le Cron de l’ensemble des instances de la mutualisation régulièrement. Couplée avec un Cron système sur le site central de la mutualisation, cela permet de simplement générer des visites régulières sur les différents sites et éviter que les tâches des sites peu visités soient trop (...) -
Submit bugs and patches
13 avril 2011Unfortunately a software is never perfect.
If you think you have found a bug, report it using our ticket system. Please to help us to fix it by providing the following information : the browser you are using, including the exact version as precise an explanation as possible of the problem if possible, the steps taken resulting in the problem a link to the site / page in question
If you think you have solved the bug, fill in a ticket and attach to it a corrective patch.
You may also (...)
Sur d’autres sites (5377)
-
What is PII ? Your introduction to personally identifiable information
-
PyQt6 6.7.0 - How to fix error : No QtMultimedia backends found
4 février, par Belleroph0NProblem on Windows 10 and Windows 11 using Anaconda.


Here is the full error message for PyQt6=6.7.0 :


No QtMultimedia backends found. Only QMediaDevices, QAudioDevice, QSoundEffect, QAudioSink, and QAudioSource are available.
Failed to initialize QMediaPlayer "Not available"
Failed to create QVideoSink "Not available"



Installed PyQt6 using a requirements file :


PyQt6
PyQt6-WebEngine
requests
pyserial
pynput



Here are a couple things I tried :


- 

- Reroll version back to PyQt6=6.6.1. This results in an error as well : ImportError : DLL load failed while importing QtGui : The specified procedure could not be found.
- I thought that missing ffmpeg might be the issue so I installed it, but the issue persists.
- Tried the setup on Ubuntu (WSL2) and the issue disappears, but there is just a black screen and nothing gets displayed in the widget. (EDIT : Got this up and running, the problem was with differences in file paths in linux vs windows.)








I am new to PyQt so any pointers will be helpful !


Edit : Here is generic code (taken from here) that gives the same error :


from PyQt6.QtGui import QIcon, QFont
from PyQt6.QtCore import QDir, Qt, QUrl, QSize
from PyQt6.QtMultimedia import QMediaPlayer
from PyQt6.QtMultimediaWidgets import QVideoWidget
from PyQt6.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel, QStyleFactory,
 QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget, QStatusBar)


class VideoPlayer(QWidget):

 def __init__(self, parent=None):
 super(VideoPlayer, self).__init__(parent)

 self.mediaPlayer = QMediaPlayer()

 btnSize = QSize(16, 16)
 videoWidget = QVideoWidget()

 openButton = QPushButton("Open Video") 
 openButton.setToolTip("Open Video File")
 openButton.setStatusTip("Open Video File")
 openButton.setFixedHeight(24)
 openButton.setIconSize(btnSize)
 openButton.setFont(QFont("Noto Sans", 8))
 openButton.setIcon(QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
 openButton.clicked.connect(self.abrir)

 self.playButton = QPushButton()
 self.playButton.setEnabled(False)
 self.playButton.setFixedHeight(24)
 self.playButton.setIconSize(btnSize)
 self.playButton.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPlay))
 self.playButton.clicked.connect(self.play)

 self.positionSlider = QSlider(Qt.Orientation.Horizontal)
 self.positionSlider.setRange(0, 0)
 self.positionSlider.sliderMoved.connect(self.setPosition)

 self.statusBar = QStatusBar()
 self.statusBar.setFont(QFont("Noto Sans", 7))
 self.statusBar.setFixedHeight(14)

 controlLayout = QHBoxLayout()
 controlLayout.setContentsMargins(0, 0, 0, 0)
 controlLayout.addWidget(openButton)
 controlLayout.addWidget(self.playButton)
 controlLayout.addWidget(self.positionSlider)

 layout = QVBoxLayout()
 layout.addWidget(videoWidget)
 layout.addLayout(controlLayout)
 layout.addWidget(self.statusBar)

 self.setLayout(layout)

 #help(self.mediaPlayer)
 self.mediaPlayer.setVideoOutput(videoWidget)
 self.mediaPlayer.playbackStateChanged.connect(self.mediaStateChanged)
 self.mediaPlayer.positionChanged.connect(self.positionChanged)
 self.mediaPlayer.durationChanged.connect(self.durationChanged)
 self.mediaPlayer.errorChanged.connect(self.handleError)
 self.statusBar.showMessage("Ready")

 def abrir(self):
 fileName, _ = QFileDialog.getOpenFileName(self, "Select Media",
 ".", "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

 if fileName != '':
 self.mediaPlayer.setSource(QUrl.fromLocalFile(fileName))
 self.playButton.setEnabled(True)
 self.statusBar.showMessage(fileName)
 self.play()

 def play(self):
 if self.mediaPlayer.playbackState() == QMediaPlayer.PlaybackState.PlayingState:
 self.mediaPlayer.pause()
 else:
 self.mediaPlayer.play()

 def mediaStateChanged(self, state):
 if self.mediaPlayer.playbackState() == QMediaPlayer.PlaybackState.PlayingState:
 self.playButton.setIcon(
 self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPause))
 else:
 self.playButton.setIcon(
 self.style().standardIcon(QStyle.StandardPixmap.SP_MediaPlay))

 def positionChanged(self, position):
 self.positionSlider.setValue(position)

 def durationChanged(self, duration):
 self.positionSlider.setRange(0, duration)

 def setPosition(self, position):
 self.mediaPlayer.setPosition(position)

 def handleError(self):
 self.playButton.setEnabled(False)
 self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())

if __name__ == '__main__':
 import sys
 app = QApplication(sys.argv)
 player = VideoPlayer()
 player.setWindowTitle("Player")
 player.resize(900, 600)
 player.show()
 sys.exit(app.exec())



The videos I want to play are in the same folder as this .py file.
The conda env (python 3.9.2) I am working on has the following packages :


certifi 2024.6.2
charset-normalizer 3.3.2
idna 3.7
pip 24.0
pynput 1.7.6
PyQt6 6.7.0
PyQt6-Qt6 6.7.1
PyQt6-sip 13.6.0
PyQt6-WebEngine 6.7.0
PyQt6-WebEngine-Qt6 6.7.1
PyQt6-WebEngineSubwheel-Qt6 6.7.1
pyserial 3.5
requests 2.31.0
setuptools 69.5.1
six 1.16.0
urllib3 2.2.1
wheel 0.43.0



PS : MacOS seems to have the same issue.


-
ffmpeg Command in Docker with Rust Tokio Closes Warp Server Connection (curl 52 Error)
3 juin 2024, par user762345I’m encountering an issue where executing an ffmpeg concatenation command through Rust’s Tokio process in a Docker container causes subsequent HTTP requests to fail. The error occurs exclusively after running the ffmpeg command and making immediate requests, resulting in a “curl 52 empty response from server” error with the connection being closed. Notably, this issue does not occur when running the same setup outside of Docker. Additionally, if no HTTP requests are made after the ffmpeg command, the curl 52 error does not occur.


Here is the verbose curl output of my minimum reproducible example (see below).


curl -v "http://localhost:3030"
* Trying 127.0.0.1:3030...
* Connected to localhost (127.0.0.1) port 3030 (#0)
> GET / HTTP/1.1
> Host: localhost:3030
> User-Agent: curl/8.1.2
> Accept: */*
> 
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server



Here are Docker logs from my minimum reproducible example (see below). The wav files are concatenated successfully, then the container appears to rebuild.


[2024-06-03T05:26:58Z INFO minimal_docker_webserver_post_error] Starting server on 0.0.0.0:3030
[2024-06-03T05:26:58Z INFO warp::server] Server::run; addr=0.0.0.0:3030
[2024-06-03T05:26:58Z INFO warp::server] listening on http://0.0.0.0:3030
[2024-06-03T05:27:07Z INFO minimal_docker_webserver_post_error] WAV files concatenated successfully
[Running 'cargo run']
 Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.06s
 Running `target/debug/minimal_docker_webserver_post_error`
[2024-06-03T05:27:08Z INFO minimal_docker_webserver_post_error] Starting server on 0.0.0.0:3030
[2024-06-03T05:27:08Z INFO warp::server] Server::run; addr=0.0.0.0:3030
[2024-06-03T05:27:08Z INFO warp::server] listening on http://0.0.0.0:3030



What I have tried :
I tried using different web frameworks (Warp, Actix-web) and request crates (reqwest, ureq). I also tried running the setup outside of Docker, which worked as expected without any issues. Additionally, I tried running the setup in Docker without making any HTTP requests after the ffmpeg command, and the connection closed successfully without errors. I also tried posting to httpbin with a minimal request, but the issue persisted.


Minimum reproducible example :


main.rs


use warp::Filter;
use reqwest::Client;
use std::convert::Infallible;
use log::{info, error};
use env_logger;
use tokio::process::Command;

#[tokio::main]
async fn main() {
 std::env::set_var("RUST_LOG", "debug");
 env_logger::init();

 let route = warp::path::end()
 .and_then(handle_request);

 info!("Starting server on 0.0.0.0:3030");
 warp::serve(route)
 .run(([0, 0, 0, 0], 3030))
 .await;
}

async fn handle_request() -> Result<impl infallible="infallible"> {
 let client = Client::new();

 let output = Command::new("ffmpeg")
 .args(&[
 "y",
 "-i", "concat:/usr/src/minimal_docker_webserver_post_error/file1.wav|/usr/src/minimal_docker_webserver_post_error/file2.wav",
 "-c", "copy",
 "/usr/src/minimal_docker_webserver_post_error/combined.wav"
 ])
 .output()
 .await;

 match output {
 Ok(output) => {
 if output.status.success() {
 info!("WAV files concatenated successfully");
 } else {
 error!("Failed to concatenate WAV files: {:?}", output);
 return Ok(warp::reply::with_status("Failed to concatenate WAV files", warp::http::StatusCode::INTERNAL_SERVER_ERROR));
 }
 },
 Err(e) => {
 error!("Failed to execute ffmpeg: {:?}", e);
 return Ok(warp::reply::with_status("Failed to execute ffmpeg", warp::http::StatusCode::INTERNAL_SERVER_ERROR));
 }
 }

 // ISSUE: Connection closes with curl: (52) Empty reply from server
 match client.get("https://httpbin.org/get").send().await {
 Ok(response) => info!("GET request successful: {:?}", response),
 Err(e) => error!("GET request failed: {:?}", e),
 }

 match client.post("https://httpbin.org/post")
 .body("field1=value1&field2=value2")
 .send().await {
 Ok(response) => info!("POST request successful: {:?}", response),
 Err(e) => error!("POST request failed: {:?}", e),
 }

 Ok(warp::reply::with_status("Request handled", warp::http::StatusCode::OK))
}
</impl>


FFMPEG command to generate the two wav files for concatenation


ffmpeg -f lavfi -i "sine=frequency=1000:duration=5" file1.wav && ffmpeg -f lavfi -i "sine=frequency=500:duration=5" file2.wav



Dockerfile


# Use the official Rust image as the base image
FROM rust:latest

# Install cargo-watch
RUN cargo install cargo-watch

# Install ffmpeg
RUN apt-get update && apt-get install -y ffmpeg

# Set the working directory inside the container
WORKDIR /usr/src/minimal_docker_webserver_post_error

# Copy the Cargo.toml and Cargo.lock files
COPY Cargo.toml Cargo.lock ./

# Copy the source code
COPY src ./src

# Copy wav files
COPY file1.wav /usr/src/minimal_docker_webserver_post_error/file1.wav
COPY file2.wav /usr/src/minimal_docker_webserver_post_error/file2.wav

# Install dependencies
RUN cargo build --release

# Expose the port that the application will run on
EXPOSE 3030

# Set the entry point to use cargo-watch
CMD ["cargo", "watch", "-x", "run"]



Cargo.toml


[package]
name = "minimal_docker_webserver_post_error"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
warp = "0.3"
reqwest = { version = "0.12.4", features = ["json"] }
tokio = { version = "1", features = ["full"] }
log = "0.4"
env_logger = "0.11.3"



Making the request to the warp server


curl -v "http://localhost:3030"