
Recherche avancée
Médias (1)
-
The Great Big Beautiful Tomorrow
28 octobre 2011, par
Mis à jour : Octobre 2011
Langue : English
Type : Texte
Autres articles (60)
-
Gestion des droits de création et d’édition des objets
8 février 2011, parPar défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;
-
Dépôt de média et thèmes par FTP
31 mai 2013, parL’outil MédiaSPIP traite aussi les média transférés par la voie FTP. Si vous préférez déposer par cette voie, récupérez les identifiants d’accès vers votre site MédiaSPIP et utilisez votre client FTP favori.
Vous trouverez dès le départ les dossiers suivants dans votre espace FTP : config/ : dossier de configuration du site IMG/ : dossier des média déjà traités et en ligne sur le site local/ : répertoire cache du site web themes/ : les thèmes ou les feuilles de style personnalisées tmp/ : dossier de travail (...) -
Keeping control of your media in your hands
13 avril 2011, parThe vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...)
Sur d’autres sites (10246)
-
Save a stream of arrays to video using FFMPEG
13 décembre 2022, par Gianluca IacchiniI made a simple fluid simulation using CUDA, and I'm trying to save it to a video using FFMPEG, however I get the
Finishing stream 0:0 without any data written to it
warning.

This is how i send the data


unsigned char* data = new unsigned char[SCR_WIDTH * SCR_HEIGHT * 4];
uchar4* pColors = new uchar4[SCR_WIDTH * SCR_HEIGHT];

for (int i = 0; i < N_FRAMES; i ++)
{
 // Computes a simulation step and sets pColors with the correct values.
 on_frame(pColors, timeStepSize);
 for (int j = 0; j < SCR_WIDTH * SCR_HEIGHT * 4; j+=4)
 {
 data[j] = pColors[j].x;
 data[j+1] = pColors[j].y;
 data[j+2] = pColors[j].z;
 data[j+3] = pColors[j].w;
 }
 std::cout.write(reinterpret_cast(data), SCR_WIDTH * SCR_HEIGHT * 4);
}



And then I pass it to FFMPEG using the following command :


./simulation.o | ffmpeg -y -f rawvideo -pixel_format rgba -video_size 1024x1024 -i - -c:v libx264 -pix_fmt yuv444p -crf 0 video.mp4

`

This works fine if I hard code the values (es. if I set
data[j] = 255
I get a red screen as expected) but when I use thepColors
variable I get the following message from FFMPEG

Finishing stream 0:0 without any data written to it.


Even though both
pColors
anddata
hold the correct values.

Here is the full report from FFMPEG


ffmpeg started on 2022-12-13 at 14:28:34
Report written to "ffmpeg-20221213-142834.log"
Command line:
ffmpeg -y -f rawvideo -report -pixel_format rgba -video_size 128x128 -i - -c:v libx264 -pix_fmt yuv444p -crf 0 video9.mp4
ffmpeg version 3.4.11-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
 built with gcc 7 (Ubuntu 7.5.0-3ubuntu1~18.04)
 configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chrom libavutil 55. 78.100 / 55. 78.100
 libavcodec 57.107.100 / 57.107.100
 libavformat 57. 83.100 / 57. 83.100
 libavdevice 57. 10.100 / 57. 10.100
 libavfilter 6.107.100 / 6.107.100
 libavresample 3. 7. 0 / 3. 7. 0
 libswscale 4. 8.100 / 4. 8.100
 libswresample 2. 9.100 / 2. 9.100
 libpostproc 54. 7.100 / 54. 7.100
Splitting the commandline.
Reading option '-y' ... matched as option 'y' (overwrite output files) with argument '1'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'rawvideo'.
Reading option '-report' ... matched as option 'report' (generate a report) with argument '1'.
Reading option '-pixel_format' ... matched as AVOption 'pixel_format' with argument 'rgba'.
Reading option '-video_size' ... matched as AVOption 'video_size' with argument '128x128'.
Reading option '-i' ... matched as input url with argument '-'.
Reading option '-c:v' ... matched as option 'c' (codec name) with argument 'libx264'.
Reading option '-pix_fmt' ... matched as option 'pix_fmt' (set pixel format) with argument 'yuv444p'.
Reading option '-crf' ... matched as AVOption 'crf' with argument '0'.
Reading option 'video9.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option y (overwrite output files) with argument 1.
Applying option report (generate a report) with argument 1.
Successfully parsed a group of options.
Parsing a group of options: input url -.
Applying option f (force format) with argument rawvideo.
Successfully parsed a group of options.
Opening an input file: -.
[rawvideo @ 0x558eba7b0000] Opening 'pipe:' for reading
[pipe @ 0x558eba78a080] Setting default whitelist 'crypto'
[rawvideo @ 0x558eba7b0000] Before avformat_find_stream_info() pos: 0 bytes read:0 seeks:0 nb_streams:1
[rawvideo @ 0x558eba7b0000] After avformat_find_stream_info() pos: 0 bytes read:0 seeks:0 frames:0
Input #0, rawvideo, from 'pipe:':
 Duration: N/A, bitrate: 13107 kb/s
 Stream #0:0, 0, 1/25: Video: rawvideo (RGBA / 0x41424752), rgba, 128x128, 13107 kb/s, 25 tbr, 25 tbn, 25 tbc
Successfully opened the file.
Parsing a group of options: output url video9.mp4.
Applying option c:v (codec name) with argument libx264.
Applying option pix_fmt (set pixel format) with argument yuv444p.
Successfully parsed a group of options.
Opening an output file: video9.mp4.
[file @ 0x558eba78a200] Setting default whitelist 'file,crypto'
Successfully opened the file.
Stream mapping:
 Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
cur_dts is invalid (this is harmless if it occurs once at the start per stream)
No more output streams to write to, finishing.
Finishing stream 0:0 without any data written to it.
detected 2 logical cores
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] Setting 'video_size' to value '128x128'
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] Setting 'pix_fmt' to value '28'
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] Setting 'time_base' to value '1/25'
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] Setting 'pixel_aspect' to value '0/1'
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] Setting 'sws_param' to value 'flags=2'
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] Setting 'frame_rate' to value '25/1'
[graph 0 input from stream 0:0 @ 0x558eba7a4a00] w:128 h:128 pixfmt:rgba tb:1/25 fr:25/1 sar:0/1 sws_param:flags=2
[format @ 0x558eba7a4b40] compat: called with args=[yuv444p]
[format @ 0x558eba7a4b40] Setting 'pix_fmts' to value 'yuv444p'
[auto_scaler_0 @ 0x558eba7a4be0] Setting 'flags' to value 'bicubic'
[auto_scaler_0 @ 0x558eba7a4be0] w:iw h:ih flags:'bicubic' interl:0
[format @ 0x558eba7a4b40] auto-inserting filter 'auto_scaler_0' between the filter 'Parsed_null_0' and the filter 'format'
[AVFilterGraph @ 0x558eba76d500] query_formats: 4 queried, 2 merged, 1 already done, 0 delayed
[auto_scaler_0 @ 0x558eba7a4be0] w:128 h:128 fmt:rgba sar:0/1 -> w:128 h:128 fmt:yuv444p sar:0/1 flags:0x4
[libx264 @ 0x558eba7cf900] using mv_range_thread = 24
[libx264 @ 0x558eba7cf900] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512
[libx264 @ 0x558eba7cf900] profile High 4:4:4 Predictive, level 1.1, 4:4:4 8-bit
[libx264 @ 0x558eba7cf900] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x1:0x111 me=hex subme=7 psy=0 mixed_ref=1 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=0 chroma_qp_offset=0 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc=cqp mbtree=0 qp=0
Output #0, mp4, to 'video9.mp4':
 Metadata:
 encoder : Lavf57.83.100
 Stream #0:0, 0, 1/12800: Video: h264 (libx264) (avc1 / 0x31637661), yuv444p, 128x128, q=-1--1, 25 fps, 12800 tbn, 25 tbc
 Metadata:
 encoder : Lavc57.107.100 libx264
 Side data:
 cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame= 0 fps=0.0 q=0.0 Lsize= 0kB time=00:00:00.00 bitrate=N/A speed= 0x 
video:0kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (pipe:):
 Input stream #0:0 (video): 0 packets read (0 bytes); 0 frames decoded; 
 Total: 0 packets (0 bytes) demuxed
Output file #0 (video9.mp4):
 Output stream #0:0 (video): 0 frames encoded; 0 packets muxed (0 bytes); 
 Total: 0 packets (0 bytes) muxed
0 frames successfully decoded, 0 decoding errors
[AVIOContext @ 0x558eba7b4120] Statistics: 2 seeks, 3 writeouts
[AVIOContext @ 0x558eba7b4000] Statistics: 0 bytes read, 0 seeks




I've never used FFMPEG before so I'm having a hard time finding my mistake.


-
Handling correctly the ffmpeg & ffprobe with php
29 septembre 2014, par coccoHandling correctly the ffmpeg & ffprobe with php
maybe not relevant final goals :
- upload clip with ajax
- get ajax info from
ffprobe
using php as json executingffprobe
once only (noffmpeg
) - handle all calculations with javascript
- maybe an extra php script tool that can create gifs, extract frames(thumbs), or a video grid preview
- when rdy ajax the conversion info to the final php conversion script executing ffmpeg once only (just the final ffmpeg string.).
I’m trying to write my own ffmpeg local web video editor that converts all formats to mp4 automatically. As mp4 is the most compatible container now and the h264+aac/+ac3 is also one of the best compressions. I also want to be able to cut, crop, resize, remove streams, add streams and more. I’m stuck on some simple problems :
1. HOW TO GET THE INFO ?
I’m using ffprobe to get the file information as json with the following command :
ffprobe -v quiet -print_format json -show_format -show_streams -show_packets '.$video
this gives you a lot of information, but some relevant stuff is not always present. I need the duration (in milliseconds),the fps (as a float) and the total frames (as an integer).
i know that these values can sometimes be found inside this array :
format.duration //Total duration
streams[0].duration //Video duration
streams[1].duration //Audio duration
streams[0].avg_frame_rate //Average framerate
streams[0].r_frame_rate //Video framerate
streams[0].nb_frames //Total framesbut most of the time
nb_frames
is missing, alsoavg_frame_rate
differs fromr_frame_rate
, which is also not always available.I know that i could use multiple commands to increase the chance to get the correct values.. but srsly ???
//fps
ffmpeg -i INPUT 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
//duration
ffmpeg -i INPUT 2>&1 | awk '/Duration/ {split($2,a,":");print a[1]*3600+a[2]*60+a[3]}'
//frames
ffmpeg -i INPUT -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1I don’t want to execute ffmpeg 3 times to get this information ; I’d prefer to just use ffprobe.
So... is there an elegant way to get the extra info that is not always present inside the ffprobe output (fps, frames, duration) ???
In the preview i want to be able to jump correctly to a specific frame (NOT TIME). if the above parameters are aviable i can do that using this command.
ffmpeg -i INPUT -vf 'select=gte(n\,FRAMENUMBER)' -vframes 1 -f image2 OUTPUT
using the above command by setting the framenumber to the last frame always returns a black frame.
if there are 50 frames (for example) the range is 1-50 — correct ? Frame 50 is black, frame 1 is ok, frame 0 returns an error...
2. WHILE READING THE LOG HOW TO SKIP ERRORS AND DETERMINE IF THE CONVERSION IS FINISHED ?
I’m able to upload one single video per time (per page) and i can read the current progress from the ffmpeg generated output log until i don’t close the page. more control/multiple conversions would be nice.
i’m reading the last line of the log with a custom tail function but as this is a log that also includes errors i don’t always get a nice line containing the desidered values. btw to check if the progress is complete i check if the last line CONTAINS the WORD
frame
....How can i find out when the conversion progress is finished ?
maybe a way to delete the log with ffmpeg command ??And skip/log the errors ??
i’m using server sent events to read the log...
here is the php code<?php
setlocale(LC_CTYPE, "en_US.UTF-8");
function tailCustom($filepath,$lines=1,$adaptive=true){
// a custom function to get the last line of a textfile.
}
function send($data){
echo "id: ".time().PHP_EOL;
echo "data: ".$data.PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true){
send(tailCustom($_GET['log'].".log"));
sleep(1);
}
?>And here the SSE js
function startSSE(fn){
sse=new EventSource("ffmpegProgress.php?log="+encodeURIComponent(fn));
sse.addEventListener('message',conversionProgress,false);
}
function conversionProgress(e){
if(e.data.substr(0,6)=='frame='){
inProgress=true;
var x=e.data.match(/frame=\s*(.*?)\s*fps=\s*(.*?)\s*q=\s*(.*?)\s*size=\s*(.*?)\s*time=\s*(.*?)\s*bitrate=\s*(.*?)\s*$/);
x.shift();x={frame:x[0]*1,fps:x[1]*1,q:x[2],size:x[3],time:x[4],bitrate:x[5]};
var elapsedTime = ((new Date().getTime()) - startTime);
var chunksPerTime = timeString2ms(x.time) / elapsedTime;
var estimatedTotalTime = duration / chunksPerTime;
var timeLeftInSeconds = Math.abs(elapsedTime-(estimatedTotalTime*1000));
var withOneDecimalPlace = Math.round(timeLeftInSeconds * 10) / 10;
conversion.innerHTML='Time Left: '+ms2TimeString(timeLeftInSeconds).split('.')[0]+'<br />'+
'Time Left2: '+(ms2TimeString(((frames-x.frame)/x.fps)*1000)+(timeString2ms(x.time)/(duration*1000)*100|0)).split('.')[0]+'<br />'+
'Estimated Total: '+ms2TimeString(estimatedTotalTime*1000).split('.')[0]+'<br />'+
'Elapsed Time: '+ms2TimeString(elapsedTime).split('.')[0];
}else{
if(inProgress){
sse.removeEventListener('message',conversionProgress,false);
sse.close();
sse=null;
conversion.textContent='Finished in '+ms2TimeString((new Date().getTime()) - startTime).split('.')[0];
//delete log/old file??
inProgress=false;
}
}
}EDIT
HERE IS A SAMPLE OUTPUT after detecting h264 codec in a m2ts with ac3 audio
As most devices can already read h264 i just need to convert the audio in aac and copy the same audio AC3 as second track. and put everything inside a mp4 container. So that i have a Android/chrome/ios & more browsers compatible file.
$opt="-map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 libfdk_aac -metadata:s:a:0 language=ita -b:a 128k -ar 48000 -ac 2 -c:a:1 copy -metadata:s:a:1 language=ita -movflags +faststart";
$i="in.m2ts";
$o="out.mp4";
$t="title";
$y="2014";
$progress="nameoftheLOG.log";
$cmd="ffmpeg -y -i ".escapeshellarg($i)." -metadata title=".$t." -metadata date=".$y." ".$opt." ".$o." null >/dev/null 2>".$progress." &";if you have any questions about the code or want to see more code just ask...
-
Create thumb of video
10 novembre 2022, par Emre8I have multiple long-video recordings. In this video, I want to create a thumb but it takes a lot of CPU and time and the most critical problem is that I can't get total thumbs. During the first 1.5 hours the thumb is formed. Unfortunately, there is no sequel.


How can I create a full thumb image in terms of performance and video length ?


ffmpeg -i input1080p.mp4 -filter_complex "select='not(mod(n,10))',scale=150:-1,tile=layout=100x5000:overlap=1" -vframes 1 -q:v 2 oneThumbFile.jpg'