
Recherche avancée
Médias (3)
-
Exemple de boutons d’action pour une collection collaborative
27 février 2013, par
Mis à jour : Mars 2013
Langue : français
Type : Image
-
Exemple de boutons d’action pour une collection personnelle
27 février 2013, par
Mis à jour : Février 2013
Langue : English
Type : Image
-
Collections - Formulaire de création rapide
19 février 2013, par
Mis à jour : Février 2013
Langue : français
Type : Image
Autres articles (46)
-
MediaSPIP v0.2
21 juin 2013, parMediaSPIP 0.2 est la première version de MediaSPIP stable.
Sa date de sortie officielle est le 21 juin 2013 et est annoncée ici.
Le fichier zip ici présent contient uniquement les sources de MediaSPIP en version standalone.
Comme pour la version précédente, il est nécessaire d’installer manuellement l’ensemble des dépendances logicielles sur le serveur.
Si vous souhaitez utiliser cette archive pour une installation en mode ferme, il vous faudra également procéder à d’autres modifications (...) -
Mise à disposition des fichiers
14 avril 2011, parPar défaut, lors de son initialisation, MediaSPIP ne permet pas aux visiteurs de télécharger les fichiers qu’ils soient originaux ou le résultat de leur transformation ou encodage. Il permet uniquement de les visualiser.
Cependant, il est possible et facile d’autoriser les visiteurs à avoir accès à ces documents et ce sous différentes formes.
Tout cela se passe dans la page de configuration du squelette. Il vous faut aller dans l’espace d’administration du canal, et choisir dans la navigation (...) -
Installation en mode ferme
4 février 2011, parLe mode ferme permet d’héberger plusieurs sites de type MediaSPIP en n’installant qu’une seule fois son noyau fonctionnel.
C’est la méthode que nous utilisons sur cette même plateforme.
L’utilisation en mode ferme nécessite de connaïtre un peu le mécanisme de SPIP contrairement à la version standalone qui ne nécessite pas réellement de connaissances spécifique puisque l’espace privé habituel de SPIP n’est plus utilisé.
Dans un premier temps, vous devez avoir installé les mêmes fichiers que l’installation (...)
Sur d’autres sites (6251)
-
How to handle queueing of video encoding during multiple video uploads ?
6 mars 2016, par Yash DesaiI am working on developing a video streaming site where users can upload videos to the site (multiple videos at once using the uploadify jquery plugin).
Now, I am faced with the question of encoding the videos to FLV for streaming them online.
When should the video encoding process take place ? Should it take place immediately after uploads have finished (i.e redirect the user to upload success page, and then start encoding in the background using exec command for ffmpeg ?) However, using this approach, how do i determine if the encoding has finished successfully ? What if users upload a corrupt video and ffmpeg fails to encode it ? How do i handle this in PHP ?
How do i queue encoding of videos since multiple users can upload videos at the same ? Does FFMpeg has its own encoding queue ?
I also read about gearman and message queueing options such as redis and AMQP in another related SO thread. Are these one of the potential solutions ?
I would really appreciate if someone could give answers to my questions.
-
Anomalie #3675 : fsockopen => lenteur dans inc/queue
7 février 2016, par Nicolas RICQUEMAQUEIl semble tout d’abord que les problèmes rapportés d’extrême lenteur de la fonction fsockopen semblent être communs sur Internet. Voir par exemple le post qui propose des solutions : http://stackoverflow.com/questions/5211658/php-fsockopen-painfully-slow ; notamment la résolution dns directe ne semble pas très efficace, mais la solution proposée, via un gethostbyname(), ne fonctionnera pas en tls (qui vérifie la cohérence du certificat publique avec l’url à connecter).
En réfléchissant un peu, outre les différentes possibilités de mitigation des problèmes évoqués quant aux limitations de la fonction fsockopen ailleurs sur Internet, il semble que l’on est ici en face, de façon plus générale, d’une "fausse bonne idée". A savoir, la création d’une tâche asynchrone via l’ouverture d’une nouvelle connexion http sur le même serveur. Après 15 ans de travail dans les infrastructures télécom, je vois difficilement comment cela peut fonctionner à tous les coups. Une telle requête, effectuée du serveur vers lui-même en utilisant l’adresse IP récupérée dans un DNS va fonctionner très différemment en fonction de la structure technique du réseau de l’hébergeur. Où sont terminées les adresses publiques ? Le Firewall autorise-t-il la réentrance ? le DNS résout il différemment sur son réseau interne par rapport au réseau publique ? Comment est configuré et où se trouve le load-balancer ? La machine est elle une machine physique (mutualisée ou non) ou plutôt une machine virtuelle avec le NAT ou du bridging interne sur l’hôte ? Tout ceci va influer sur le fait que le fsockopen (ou curl) va fonctionner ou non. Il y a des bonnes pratiques dans l’industrie, mais à aucun moment vous pouvez être sûr, qu’un logiciel comme SPIP qui doit tenter de s’adapter partout, va fonctionner partout. Et le cURL n’est pas beaucoup plus rustique en la matière (un peu plus tout de même, c’est un appel unix hors php, les auteurs de cURL ont bien blindé leur code, mais je ne m’y fierai pas à 100%).
Le problème est donc, que parfois, en fonction de l’hébergeur, tout simplement, comme l’indique bien le commentaire dans le code existant de queue.php, "cela ne va par marcher".
Mais qu’est ce qui se passe quand cela ne fonctionne pas, et pourquoi cela ralenti autant l’affichage des pages web ?
- Si !function_exists(’fsockopen’) et !function_exists("curl_init"), alors c’est simple, on va appliquer l’astuce de l’image-background
- Si les fonctions existent bien, mais que "quelque chose" dans l’infrastructure "bloque" la connexion. Il y a 2 façons de bloquer. Un load balancer, un serveur, ou un routeur renverront probablement un TCP/RST immédiatement, fermant donc la connexion TCP, et 5 ms après on sort vers l’image background. Y’a pas de dégats.
- Si les fonctions existent bien, et que c’est un "firewall" qui ne laisse pas passer, il ne va rien répondre du tout, c’est à dire laisser tomber la connexion en timeout, qui est ici de 1s (très très très long pour un appel vers sois-même ! c’est un premier bug, il ne faudrait pas dépasser 20ms maximum). Donc, Curl ou fsockopen, l’utilisateur, dans l’affichage de la page, va perdre une première seconde. Pourquoi première ? parce que le code de la fonction semble être pouvoir être appelé plusieurs fois (commentaire dans le code "ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent") et que le fichier est locké avant l’appel à fsockopen ou à curl, dès la sortie de la fonction, après un timeout de 1s de fsockopen par exemple, on aura déjà expiré le lock. Donc on peut probablement se retrouver dans un cas ou la fonction (qui échoue à chaque fois via un timeout de 1s) est appelée plusieurs fois de suite. Bofff ;-). Il faut donc décorréler cette valeur de check du lock avec le timeout de durée des appels réseaux au moins d’un facteur 10 pour éviter les effets d’avalanche...Conclusion : les appels asynchrones sont une très bonne idée en théorie, mais en pratique, je pense qu’ils risquent d’amener plus de problèmes que de solutions. Et cela semble se vérifier en regard des nombreux utilisateurs qui semblent avoir le problème sur le réseau, ou décident finalement de rester sur la 2.1, ou de changer de crémerie (hébergeur ou CMS). Pour les moins chanceux, de se contenter d’un site qui est devenu irresponsif...
Il est possible à mon avis toutefois de conserver intelligemment cette technique quand elle est applicable. Pourquoi réessayer et se remplanter d’une seconde comme les shadoks sur chaque page ? Si un hébergeur ne fonctionne pas, cela ne va pas fonctionner à tous les coups. Tout du moins jusqu’à ce qu’il change son infra ou le client déménage ailleurs. Je proposerai donc une approche "hybride", mais simple, en détectant d’un côté la bonne méthode à utiliser, et en l’appliqant simplement dans queue.php :
- Sur le site "privé", exécutée par exemple une fois par session d’un rédacteur, par appel asynchrone via une background image (pour ne pas ralentir le rédacteur), une fonction toute simple qui essaie de se connecter sur l’url cron, successivement avec les différentes méthodes (fsockopen, curl, pourquoi pas fopen directement qui accepte aussi les urls..., et 36 nouvelles méthodes qui apparaitront à l’avenir). Cette fonction détermine la méthode la plus rapide (qui pourrait très bien être fsockopen sur beaucoup d’hébergeurs !) par simple comparaison et stocke ce résultat dans une variable quelque part dans le site. Elle peut aussi déterminer que même si cela marche, les délais introduits (>100ms par exemple) ne justifient pas se passer de la technique de l’image background.
- quand le code de queue.php, on "n’essaie pas des méthodes jusqu’à en trouver une qui fonctionne en perdant du temps sur le dos du client", mais on utilise la méthode récupérée dans la variable avec un switch par exemple, et on est sûr d’utiliser la meilleure méthode :-) et la meilleure ! -
Rendering Bitmap using ANativeWindow
19 février 2016, par William SeemannI’m decoding a video frame and trying to render is using Android’s ANativeWindow API in conjunction with a SurfaceView. I know I’m decoding the frame successfully because my demo application returns the decoded (and re-encoded) frame as a bitmap and displays it in an ImageView (bottom image). However, when trying to draw the decoded frame to a SurfaceView I’m getting garbage output (top image). Can someone explain why ?
const int TARGET_IMAGE_FORMAT = AV_PIX_FMT_RGBA;
const int TARGET_IMAGE_CODEC = AV_CODEC_ID_PNG;
void convert_image(State *state, AVCodecContext *pCodecCtx, AVFrame *pFrame, AVPacket *avpkt, int *got_packet_ptr, int width, int height) {
AVCodecContext *codecCtx;
AVCodec *codec;
AVFrame *frame;
*got_packet_ptr = 0;
if (width == -1) {
width = pCodecCtx->width;
}
if (height == -1) {
height = pCodecCtx->height;
}
codec = avcodec_find_encoder(TARGET_IMAGE_CODEC);
if (!codec) {
printf("avcodec_find_decoder() failed to find decoder\n");
goto fail;
}
codecCtx = avcodec_alloc_context3(codec);
if (!codecCtx) {
printf("avcodec_alloc_context3 failed\n");
goto fail;
}
codecCtx->bit_rate = pCodecCtx->bit_rate;
//codecCtx->width = pCodecCtx->width;
//codecCtx->height = pCodecCtx->height;
codecCtx->width = width;
codecCtx->height = height;
codecCtx->pix_fmt = TARGET_IMAGE_FORMAT;
codecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
codecCtx->time_base.num = pCodecCtx->time_base.num;
codecCtx->time_base.den = pCodecCtx->time_base.den;
if (!codec || avcodec_open2(codecCtx, codec, NULL) < 0) {
printf("avcodec_open2() failed\n");
goto fail;
}
frame = av_frame_alloc();
if (!frame) {
goto fail;
}
// Determine required buffer size and allocate buffer
int numBytes = avpicture_get_size(TARGET_IMAGE_FORMAT, codecCtx->width, codecCtx->height);
void * buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
printf("wqwq %d\n", numBytes);
avpicture_fill(((AVPicture *)frame),
buffer,
TARGET_IMAGE_FORMAT,
codecCtx->width,
codecCtx->height);
avpicture_alloc(((AVPicture *)frame),
TARGET_IMAGE_FORMAT,
codecCtx->width,
codecCtx->height);
struct SwsContext *scalerCtx = sws_getContext(pCodecCtx->width,
pCodecCtx->height,
pCodecCtx->pix_fmt,
//pCodecCtx->width,
//pCodecCtx->height,
width,
height,
TARGET_IMAGE_FORMAT,
SWS_FAST_BILINEAR, 0, 0, 0);
if (!scalerCtx) {
printf("sws_getContext() failed\n");
goto fail;
}
sws_scale(scalerCtx,
(const uint8_t * const *) pFrame->data,
pFrame->linesize,
0,
pFrame->height,
frame->data,
frame->linesize);
int ret = avcodec_encode_video2(codecCtx, avpkt, frame, got_packet_ptr);
// code to draw the re-encoded frame on the surface view
if (state->native_window) {
ANativeWindow_Buffer windowBuffer;
if (ANativeWindow_lock(state->native_window, &windowBuffer, NULL) == 0) {
memcpy(windowBuffer.bits, avpkt->data, windowBuffer.width * windowBuffer.height * 4);
ANativeWindow_unlockAndPost(state->native_window);
}
}
if (ret < 0) {
*got_packet_ptr = 0;
}
fail:
av_free(frame);
free(buffer);
if (codecCtx) {
avcodec_close(codecCtx);
av_free(codecCtx);
}
if (scalerCtx) {
sws_freeContext(scalerCtx);
}
if (ret < 0 || !*got_packet_ptr) {
av_free_packet(avpkt);
}
}