
Recherche avancée
Médias (2)
-
SPIP - plugins - embed code - Exemple
2 septembre 2013, par
Mis à jour : Septembre 2013
Langue : français
Type : Image
-
Publier une image simplement
13 avril 2011, par ,
Mis à jour : Février 2012
Langue : français
Type : Video
Autres articles (43)
-
Use, discuss, criticize
13 avril 2011, parTalk to people directly involved in MediaSPIP’s development, or to people around you who could use MediaSPIP to share, enhance or develop their creative projects.
The bigger the community, the more MediaSPIP’s potential will be explored and the faster the software will evolve.
A discussion list is available for all exchanges between users. -
Supporting all media types
13 avril 2011, parUnlike most software and media-sharing platforms, MediaSPIP aims to manage as many different media types as possible. The following are just a few examples from an ever-expanding list of supported formats : images : png, gif, jpg, bmp and more audio : MP3, Ogg, Wav and more video : AVI, MP4, OGV, mpg, mov, wmv and more text, code and other data : OpenOffice, Microsoft Office (Word, PowerPoint, Excel), web (html, CSS), LaTeX, Google Earth and (...)
-
Les statuts des instances de mutualisation
13 mars 2010, parPour des raisons de compatibilité générale du plugin de gestion de mutualisations avec les fonctions originales de SPIP, les statuts des instances sont les mêmes que pour tout autre objets (articles...), seuls leurs noms dans l’interface change quelque peu.
Les différents statuts possibles sont : prepa (demandé) qui correspond à une instance demandée par un utilisateur. Si le site a déjà été créé par le passé, il est passé en mode désactivé. publie (validé) qui correspond à une instance validée par un (...)
Sur d’autres sites (8882)
-
using ffmpeg as multiple downloads
26 avril 2013, par user2321982well guys, I'm having problems with my application.
well I'll explain more, I'm using the plugin uploader uploads multiple videos and I'm using the ffmpeg extension to my php version.<code class="echappe-js"><script type="text/javascript"><br />
// Convert divs to queue widgets when the DOM is ready<br />
$(function() {<br />
$("#uploader").pluploadQueue({<br />
// General settings<br />
runtimes : &#39;gears,flash,silverlight,browserplus,html5&#39;,<br />
url : &#39;upload.php?id=&lt;?= $login_usuario; ?>&amp;name=&lt;?= $name_user; ?>&#39;,<br />
flash_swf_url : &#39;plugins/plupload/plupload.flash.swf&#39;,<br />
containers: &#39;plupload&#39;,<br />
multipart: true,<br />
urlstream_upload: true,<br />
multipart_params:{directory:&#39;uploads&#39;},<br />
multi_selection: true,<br />
<br />
max_file_size : &#39;500mb&#39;,<br />
chunk_size : &#39;1mb&#39;,<br />
unique_names : true,<br />
<br />
// Specify what files to browse for<br />
filters : [<br />
{title : "Video Files", extensions : "avi,mpg,wmv,flv,3gp,mpeg,mpeg4,mpg4,mp4"}<br />
],<br />
// Silverlight settings<br />
silverlight_xap_url : &#39;plugins/plupload/plupload.silverlight.xap&#39;<br />
});<br />
<br />
uploader.ini();<br />
<br />
// Client side form validation<br />
$(&#39;form&#39;).submit(function(e) {<br />
var uploader = $(&#39;#uploader&#39;).plupload(&#39;getUploader&#39;);<br />
<br />
// Files in queue upload them first<br />
if (uploader.files.length > 0) {<br />
// When all files are uploaded submit form<br />
uploader.bind(&#39;StateChanged&#39;, function() {<br />
if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) {<br />
$(&#39;form&#39;)[0].submit();<br />
}<br />
});<br />
<br />
uploader.start();<br />
} else<br />
alert(&#39;You must at least upload one file.&#39;);<br />
<br />
return false;<br />
});<br />
});<br />
</script>You browser doesn't have Flash, Silverlight, Gears, BrowserPlus or HTML5 support.
well he calls javascript in a php file, in case it will upload the videos.
what I want is to get the length, resolution, file size and take a screenshot of the video randomly, so far so good, the problem is that it only works with only one upload at a time.
When sending more than one he does the procedure with ffmpeg, besides the most is not taking a screenshot of the video.
below is my code<?php
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
if (!extension_loaded ('ffmpeg') ) exit ( 'ffmpeg não foi carregado!' );
// HTTP headers for no cache etc
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
include("includes/seguranca.php");
include("includes/classes/class.mysql.php");
include("includes/funcoes/sql_inject.php");
$id_user = anti_injection($_GET['id']);
session_start();
// Settings
//$targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
$targetDir = 'uploads/';
//$cleanupTargetDir = false; // Remove old files
//$maxFileAge = 60 * 60; // Temp file age in seconds
// 5 minutes execution time
@set_time_limit(5 * 60);
// Uncomment this one to fake upload time
// usleep(5000);
// Get parameters
$chunk = isset($_REQUEST["chunk"]) ? $_REQUEST["chunk"] : 0;
$chunks = isset($_REQUEST["chunks"]) ? $_REQUEST["chunks"] : 0;
$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : '';
// Clean the fileName for security reasons
$fileName = preg_replace('/[^\w\._]+/', '', $fileName);
// Make sure the fileName is unique but only if chunking is disabled
if ($chunks < 2 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) {
$ext = strrpos($fileName, '.');
$fileName_a = substr($fileName, 0, $ext);
$fileName_b = substr($fileName, $ext);
$count = 1;
while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b))
$count++;
$fileName = $fileName_a . '_' . $count . $fileName_b;
}
// Create target dir
if (!file_exists($targetDir))
@mkdir($targetDir);
// Look for the content type header
if (isset($_SERVER["HTTP_CONTENT_TYPE"]))
$contentType = $_SERVER["HTTP_CONTENT_TYPE"];
if (isset($_SERVER["CONTENT_TYPE"]))
$contentType = $_SERVER["CONTENT_TYPE"];
// Handle non multipart uploads older WebKit versions didn't support multipart in HTML5
if (strpos($contentType, "multipart") !== false) {
if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
// Open temp file
$out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
if ($out) {
// Read binary input stream and append it to temp file
$in = fopen($_FILES['file']['tmp_name'], "rb");
if ($in) {
while ($buff = fread($in, 4096))
fwrite($out, $buff);
} else
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
fclose($in);
fclose($out);
@unlink($_FILES['file']['tmp_name']);
} else
die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
} else
die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
} else {
// Open temp file
$out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
if ($out) {
// Read binary input stream and append it to temp file
$in = fopen("php://input", "rb");
if ($in) {
while ($buff = fread($in, 4096))
fwrite($out, $buff);
} else
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
fclose($in);
fclose($out);
} else
die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
}
$photoName = $_FILES['file']['name'];
$exploded_photoName = explode('.', $photoName);
$user_id = $_SESSION['SESS_MEMBER_ID'];
if(!isset($_SESSION[$photoName])) {
$_SESSION[$photoName] = '1';
}
if($chunk==1){
$movie_file = realpath("/uploads/".$fileName);
// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo
$movie = new ffmpeg_movie($movie_file);
// pegamos a duranção do video em segundos
$duration = round ( $movie->getDuration() , 0 );
// recebemos o número de frames do vídeo
$totalFrames = $movie->getFrameCount();
// recebemos a altura do vídeo em pixels
$height = $movie->getFrameHeight ();
// recebemos a largura do vídeo em pixels
$width = $movie->getFrameWidth ();
$thumbnailOf = $movie->getFrameRate() * 5;
$thumbnailOf = round ( $movie->getFrameCount() / 2 );
// precisamos criar uma imagem GD para o ffmpeg-php trabalhar nela
$image = imagecreatetruecolor ($width,$height ) ;
// criamos a instancia do frame com a classe ffmpeg_frame
$frame = new ffmpeg_frame ($image);
// escolhemos o frame que queremos salvar como jpeg
$thumbnailOf = rand (1,$movie->getFrameCount());
// recebe o frame
$frame = $movie->getFrame ( $thumbnailOf );
// converte para uma imagem GD
$image = $frame->toGDImage ();
$size = filesize("uploads/".$fileName);
$valuea = rand(0,100);
$valueb = rand(0,100);
$valuec = rand(0,10);
$nome = @md5(date('now') * $valuea - $valueb / $valuec);
$dir = realpath("uploads/snapshots/$nome.jpg");
//salva no HD.
imagejpeg($image, $dir, 100);
$resolu = $width."x".$height;
mysql_query("INSERT INTO video
(poster_id,duration,video,titulo,resolucao,tamanho)
VALUES
('$id_user','$duration','$fileName','$exploded_photoName[0]','$resolu','$size')") or die(mysql_error());
}
// Return JSON-RPC response
die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');
?>I did another method not so effective to do what I want but it only works if I open the page individually.
I removed the code from ffmpeg extension and put an include to that page.
<?
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
if (!extension_loaded ('ffmpeg') ) exit ( 'ffmpeg não foi carregado!' );
include("includes/seguranca.php");
include("includes/classes/class.mysql.php");
include("includes/funcoes/sql_inject.php");
$id_user = @anti_injection($_GET['id']);
class process{
public $videos;
public $target;
public $id_vid;
public function screen(){
$videos = $this->videos;
$target = $this->target;
$movie_file = realpath($videos);
// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo
$movie = new ffmpeg_movie($movie_file);
$totalFrames = $movie->getFrameCount();
$thumbnailOf = $movie->getFrameRate() * 5;
$thumbnailOf = round ( $movie->getFrameCount() / 2 );
// criamos a instancia do frame com a classe ffmpeg_frame
$frame = new ffmpeg_frame ( $image );
// escolhemos o frame que queremos salvar como jpeg
$thumbnailOf = rand (1,$movie->getFrameCount());
// recebe o frame
$frame = $movie->getFrame ( $thumbnailOf );
// converte para uma imagem GD
$image = $frame->toGDImage ();
$valuea = rand(0,100);
$valueb = rand(0,100);
$valuec = rand(0,10);
$nome = @md5(date('now') * $valuea - $valueb / $valuec);
$dir = $target."snapshots/".$nome.".jpeg";
//salva no HD.
imagejpeg($image,$dir, 100);
$q = new Query;
$q ->update('video')
->set(
array(
'screen'=>$nome.".jpeg"
)
)
->where_equal_to(
array(
'id_video'=>$this->id_vid
)
)
->limit(1)
->run();
}
public function duration(){
$videos = $this->videos;
$movie_file = realpath($videos);
// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo
$movie = new ffmpeg_movie($movie_file);
// pegamos a duranção do video em segundos
$duration = round ( $movie->getDuration() , 0 );
$q = new Query;
$q ->update('video')
->set(
array(
'duration'=>$duration
)
)
->where_equal_to(
array(
'id_video'=>$this->id_vid
)
)
->limit(1)
->run();
}
public function resolution(){
$videos = $this->videos;
$movie_file = realpath($videos);
// instancia a classe ffmpeg_movie para pegarmos as informações que queremos o vídeo
$movie = new ffmpeg_movie($movie_file);
// recebemos a altura do vídeo em pixels
$height = $movie->getFrameHeight ();
// recebemos a largura do vídeo em pixels
$width = $movie->getFrameWidth ();
$resolucao = $width."x".$height;
$q = new Query;
$q ->update('video')
->set(
array(
'resolucao'=>$resolucao
)
)
->where_equal_to(
array(
'id_video'=>$this->id_vid
)
)
->limit(1)
->run();
}
final public function checar($a){
$q = new Query;
$q ->update('video')
->set(
array(
'process'=>$a
)
)
->where_equal_to(
array(
'id_video'=>$this->id_vid
)
)
->limit(1)
->run();
}
}
$q=new Query;
$q->select(
array(
'id_video',
'video',
'dir',
'screen',
'poster_id',
'resolucao',
'duration'
)
)
->from('video')
->run();
if($q){
$users=$q->get_selected();
foreach($users as $user){
$c = new process;
$c->videos = $user['video'];
$c->target = $user['dir'];
$c->id_vid = $user['id_video'];
if(($user['screen'] == 'NULL') or ($user['duration'] == 'NULL') or ($user['resolucao'] == 'NULL')){
$c->checar(0);
if($user['screen'] == 'NULL'){
$c->screen();
}
if($user['duration'] == 'NULL'){
$c->duration();
}
if($user['resolucao'] == 'NULL'){
$c->resolution();
}
}else{
$c->checar(1);
}
}
}
else{
echo 'Sorry, no users found.';
}
?> -
Combine multiple videos into one
10 janvier 2012, par StackedCrookedI have three videos :
- a lecture that was filmed with a video camera
- a video of the desktop capture of the computer used in the lecture
- and the video of the whiteboard
I want to create a final video with those three components taking up a certain region of the screen.
Is open-source software that would allow me to do this (mencoder, ffmpeg, virtualdub..) ? Which do you recommend ?
Or is there a C/C++ API that would enable me to create something like that programmatically ?
Edit
There will be multiple recorded lectures in the future. This means that I need a generic/automated solution.I'm currently checking out if I could write an application with GStreamer to do this job. Any comments on that ?
Solved !
I succeeded in doing this with GStreamer's videomixer element. I use the gst-launch syntax to create a pipeline and then load it with gst_parse_launch. It's a really productive way to implement complex pipelines.Here's a pipeline that takes two incoming video streams and a logo image, blends them into one stream and the duplicates it so that it simultaneously displayed and saved to disk.
desktop. ! queue
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=640,height=480
! videobox right=-320
! ffmpegcolorspace
! vmix.sink_0
webcam. ! queue
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=320,height=240
! vmix.sink_1
logo. ! queue
! jpegdec
! ffmpegcolorspace
! videoscale
! video/x-raw-yuv,width=320,height=240
! vmix.sink_2
vmix. ! t.
t. ! queue
! ffmpegcolorspace
! ffenc_mpeg2video
! filesink location="recording.mpg"
t. ! queue
! ffmpegcolorspace
! dshowvideosink
videotestsrc name="desktop"
videotestsrc name="webcam"
multifilesrc name="logo" location="logo.jpg"
videomixer name=vmix
sink_0::xpos=0 sink_0::ypos=0 sink_0::zorder=0
sink_1::xpos=640 sink_1::ypos=0 sink_1::zorder=1
sink_2::xpos=640 sink_2::ypos=240 sink_2::zorder=2
tee name="t" -
Mixing a FLV audio stream with a WAV background track, and converting to MP3 with SoX and FFmpeg
7 septembre 2012, par tubboI'm building a Flash-based recording application for a contracted web site. It streams the recorded voice (via SWF) to a Red5 server, then uses a combination of FFmpeg and SoX to compile the vocal audio with a lower-in-volume background music track. This all has to happen on-demand, that is, when a user "saves" his or her vocal recording.
Here is an example command I will be running. Names have been changed to protect the innocent. The filenames describe their role in the final file :
sox --combine mix -p --no-show-progress --norm "|ffmpeg -i /usr/share/red5/webapps/audiorecorder/stream/SPOKEN_VOICE.flv -t wav pipe:1" /var/www/ufiles/music/BACKGROUND_MUSIC.wav - | ffmpeg -i pipe:1 /var/www/ufiles/recordings/COMPILED_AUDIO_RECORDING.mp3
When I run this command in the shell, this is what happens :
$ sox --combine mix -p --no-show-progress --norm "|ffmpeg -i audioStream_1321399534128_21.flv -ar 44100 -ac 2 -t wav pipe:1" wrong.wav - | ffmpeg -i pipe:1 ~/www/trauma101.com/compiled.mp3
ffmpeg version N-34884-g7575980, Copyright (c) 2000-2011 the FFmpeg developers
built on Nov 15 2011 14:06:49 with gcc 4.4.5
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libx264 --enable-x11grab --enable-libspeex
libavutil 51. 25. 0 / 51. 25. 0
libavcodec 53. 34. 0 / 53. 34. 0
libavformat 53. 20. 0 / 53. 20. 0
libavdevice 53. 4. 0 / 53. 4. 0
libavfilter 2. 48. 1 / 2. 48. 1
libswscale 2. 1. 0 / 2. 1. 0
libpostproc 51. 2. 0 / 51. 2. 0
ffmpeg version N-34884-g7575980, Copyright (c) 2000-2011 the FFmpeg developers
built on Nov 15 2011 14:06:49 with gcc 4.4.5
configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libmp3lame --enable-libx264 --enable-x11grab --enable-libspeex
libavutil 51. 25. 0 / 51. 25. 0
libavcodec 53. 34. 0 / 53. 34. 0
libavformat 53. 20. 0 / 53. 20. 0
libavdevice 53. 4. 0 / 53. 4. 0
libavfilter 2. 48. 1 / 2. 48. 1
libswscale 2. 1. 0 / 2. 1. 0
libpostproc 51. 2. 0 / 51. 2. 0
[libspeex @ 0x1e36b20] Missing Speex header, assuming defaults.
Input #0, flv, from 'audioStream_1321399534128_21.flv':
Metadata:
novideocodec : 0
server : Red5 Server 1.0.0 RC2 Rev: 4295
creationdate : Tue Nov 15 15:25:41 PST 2011
canSeekToEnd : true
Duration: 00:00:06.77, start: 0.000000, bitrate: 43 kb/s
Stream #0:0: Audio: speex, 16000 Hz, 1 channels, s16
Invalid duration specification for t: wav
sox FAIL formats: can't open input pipe `|ffmpeg -i audioStream_1321399534128_21.flv -ar 44100 -ac 2 -t wav pipe:1': premature EOFI think the issue is stemming from the conversion from FLV to WAV in FFmpeg, and since it's being piped in it causes the whole process to fail. I always get that duration warning, but when FFmpeg outputs to a .wav file and the SoX command is run separately, I can still get a WAV from SoX and convert that to MP3 manually. I'd like to do all this in one line, piping the data between applications.
What do I do ?