
Recherche avancée
Autres articles (72)
-
Contribute to documentation
13 avril 2011Documentation is vital to the development of improved technical capabilities.
MediaSPIP welcomes documentation by users as well as developers - including : critique of existing features and functions articles contributed by developers, administrators, content producers and editors screenshots to illustrate the above translations of existing documentation into other languages
To contribute, register to the project users’ mailing (...) -
MediaSPIP en mode privé (Intranet)
17 septembre 2013, parÀ partir de la version 0.3, un canal de MediaSPIP peut devenir privé, bloqué à toute personne non identifiée grâce au plugin "Intranet/extranet".
Le plugin Intranet/extranet, lorsqu’il est activé, permet de bloquer l’accès au canal à tout visiteur non identifié, l’empêchant d’accéder au contenu en le redirigeant systématiquement vers le formulaire d’identification.
Ce système peut être particulièrement utile pour certaines utilisations comme : Atelier de travail avec des enfants dont le contenu ne doit pas (...) -
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 ;
Sur d’autres sites (10292)
-
ffmpeg - Understand images to video output, players show different images and lengths
8 juillet 2023, par Matt CI'm using multiple images to create a video with each image on a 1-second long frame. This is the command I'm using :


ffmpeg -framerate 1 -i 'image%d.jpg' -c:v libx264 -r 1 -pix_fmt yuv420p out.mp4



This seems straightforward and exactly what many others have done with success. However, the output I get is an mp4 which windows file explorer says is 4 seconds long, and is different in VLC and Windows media player and neither is the desired output.


In Windows : the video plays for 4 seconds with a black screen and at this point the time line at the bottom is filled up at 4 seconds, indicating the video is over. But it keeps playing, for another 4 seconds. And the last 4 seconds (from 0:04 to 0:07) is actually the desired output.







 Frame 

Image 







 1 

black screen 




 2 

black screen 




 3 

black screen 




 4 

black screen 




 5 

image1.jpg 




 6 

image2.jpg 




 7 

image3.jpg 




 8 

image4.jpg 









In VLC : the video shows last image supplied as input for 3 seconds, followed by the second to last image for 1 second.







 Frame 

Image 







 1 

image4.jpg 




 2 

image4.jpg 




 3 

image4.jpg 




 4 

image3.jpg 









Questions :


- 

- How/Why are these different in different players ?
- Why, in VLC, are only two images showing up, and why would one of them last for 3 seconds ?
- In Windows, why/how is the video 8 seconds long but shows up as 4 seconds both in the file explorer and in the actual media player ?
- How do I get the desired output, and what caused my case to not work as it did for seemingly most others ?










-
Demuxing a video media file with FFMPEG
23 février 2016, par MOHWAfter starting this question Extracting the h264 part of a video file (demuxing) I was actually able to figure out that,
- When I reverted to an older version of FFMPEG (avcodec-55.dll) as against the avcodec-57.dll I was using earlier, the code worked perfectly without any error and the resultant h264 file played with ffplay.
- When I tracked my output when using the avcodec-57.dll version of FFMPEG (most recent version), there was actually an error
"Using AVStream.codec.time_base as a timebase hint to the muxer is deprecated. Set AVStream.time_base instead"
after the callavformat_write_header(ofmt_ctx_v, NULL)
and another one after the call toavformat_write_header(ofmt_ctx_a, NULL)
. The program continued executing, the audio was fine but the .h264 file wasn’t.
The output
Press any key to continue . . .
Press any key to continue . . .
Press any key to continue . . .
Press any key to continue . . .
==============Input Video=============
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sample.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
title : 10153755968775490
encoder : Lavf57.19.100
Duration: 00:01:07.27, start: 0.020021, bitrate: 1058 kb/s
Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 400x224 [
SAR 199:200 DAR 199:112], 927 kb/s, 15 fps, 15 tbr, 15360 tbn, 30 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(eng): Audio: mp3 (mp4a / 0x6134706D), 48000 Hz, stereo, s16p, 12
8 kb/s (default)
Metadata:
handler_name : SoundHandler
==============Output Video============
Output #0, h264, to 'sample.h264':
Stream #0:0: Video: h264 (High), yuv420p, 400x224 [SAR 199:200 DAR 199:112],
q=2-31, 927 kb/s, 30 tbc
==============Output Audio============
Output #0, mp3, to 'sample.mp3':
Stream #0:0: Audio: mp3, 48000 Hz, stereo, s16p, 128 kb/s
======================================
[h264 @ 00a3ee20] Using AVStream.codec.time_base as a timebase hint to the muxer
is deprecated. Set AVStream.time_base instead.
[mp3 @ 00a4fec0] Using AVStream.codec.time_base as a timebase hint to the muxer
is deprecated. Set AVStream.time_base instead.
Press any key to continue . . .The code
#include
#define __STDC_CONSTANT_MACROS
extern "C"
{
#include "libavformat/avformat.h"
}
#define USE_H264BSF 1
int main()
{
AVOutputFormat *ofmt_a = NULL,*ofmt_v = NULL;
AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx_a = NULL, *ofmt_ctx_v = NULL;
AVPacket pkt;
int ret, i;
int videoindex=-1,audioindex=-1;
int frame_index=0;
const char *in_filename = "sample.mp4";
const char *out_filename_v = "sample.h264";
const char *out_filename_a = "sample.mp3";
av_register_all();
//Input
if ((ret = avformat_open_input(&ifmt_ctx, in_filename, 0, 0)) < 0) {
printf( "Could not open input file.");
goto end;
}
if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) < 0) {
printf( "Failed to retrieve input stream information");
goto end;
}
system("pause");
//Output
avformat_alloc_output_context2(&ofmt_ctx_v, NULL, NULL, out_filename_v);
if (!ofmt_ctx_v) {
printf( "Could not create output context\n");
ret = AVERROR_UNKNOWN;
goto end;
}
ofmt_v = ofmt_ctx_v->oformat;
system("pause");
avformat_alloc_output_context2(&ofmt_ctx_a, NULL, NULL, out_filename_a);
if (!ofmt_ctx_a) {
printf( "Could not create output context\n");
ret = AVERROR_UNKNOWN;
goto end;
}
ofmt_a = ofmt_ctx_a->oformat;
system("pause");
for (i = 0; i < ifmt_ctx->nb_streams; i++) {
//Create output AVStream according to input AVStream
AVFormatContext *ofmt_ctx;
AVStream *in_stream = ifmt_ctx->streams[i];
AVStream *out_stream = NULL;
if(ifmt_ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO){
videoindex=i;
out_stream=avformat_new_stream(ofmt_ctx_v, in_stream->codec->codec);
ofmt_ctx=ofmt_ctx_v;
}else if(ifmt_ctx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO){
audioindex=i;
out_stream=avformat_new_stream(ofmt_ctx_a, in_stream->codec->codec);
ofmt_ctx=ofmt_ctx_a;
}else{
break;
}
if (!out_stream) {
printf( "Failed allocating output stream\n");
ret = AVERROR_UNKNOWN;
goto end;
}
//Copy the settings of AVCodecContext
if (avcodec_copy_context(out_stream->codec, in_stream->codec) < 0) {
printf( "Failed to copy context from input to output stream codec context\n");
goto end;
}
out_stream->codec->codec_tag = 0;
if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
}
system("pause");
//Dump Format------------------
printf("\n==============Input Video=============\n");
av_dump_format(ifmt_ctx, 0, in_filename, 0);
printf("\n==============Output Video============\n");
av_dump_format(ofmt_ctx_v, 0, out_filename_v, 1);
printf("\n==============Output Audio============\n");
av_dump_format(ofmt_ctx_a, 0, out_filename_a, 1);
printf("\n======================================\n");
//Open output file
if (!(ofmt_v->flags & AVFMT_NOFILE)) {
if (avio_open(&ofmt_ctx_v->pb, out_filename_v, AVIO_FLAG_WRITE) < 0) {
printf( "Could not open output file '%s'", out_filename_v);
goto end;
}
}
if (!(ofmt_a->flags & AVFMT_NOFILE)) {
if (avio_open(&ofmt_ctx_a->pb, out_filename_a, AVIO_FLAG_WRITE) < 0) {
printf( "Could not open output file '%s'", out_filename_a);
goto end;
}
}
//Write file header
if (avformat_write_header(ofmt_ctx_v, NULL) < 0) {
printf( "Error occurred when opening video output file\n");
goto end;
}
if (avformat_write_header(ofmt_ctx_a, NULL) < 0) {
printf( "Error occurred when opening audio output file\n");
goto end;
}
system("pause");
#if USE_H264BSF
AVBitStreamFilterContext* h264bsfc = av_bitstream_filter_init("h264_mp4toannexb");
#endif
while (1) {
AVFormatContext *ofmt_ctx;
AVStream *in_stream, *out_stream;
//Get an AVPacket
if (av_read_frame(ifmt_ctx, &pkt) < 0)
break;
in_stream = ifmt_ctx->streams[pkt.stream_index];
if(pkt.stream_index==videoindex){
out_stream = ofmt_ctx_v->streams[0];
ofmt_ctx=ofmt_ctx_v;
#if USE_H264BSF
av_bitstream_filter_filter(h264bsfc, in_stream->codec, NULL, &pkt.data, &pkt.size, pkt.data, pkt.size, 0);
#endif
printf("Write Video Packet. size:%d\tpts:%lld\n",pkt.size,pkt.pts);
}else if(pkt.stream_index==audioindex){
out_stream = ofmt_ctx_a->streams[0];
ofmt_ctx=ofmt_ctx_a;
printf("Write Audio Packet. size:%d\tpts:%lld\n",pkt.size,pkt.pts);
}else{
continue;
}
//Convert PTS/DTS
pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base, out_stream->time_base, (AVRounding)(AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX));
pkt.duration = av_rescale_q(pkt.duration, in_stream->time_base, out_stream->time_base);
pkt.pos = -1;
pkt.stream_index=0;
//Write
if (av_interleaved_write_frame(ofmt_ctx, &pkt) < 0) {
printf( "Error muxing packet\n");
break;
}
//printf("Write %8d frames to output file\n", frame_index);
av_free_packet(&pkt);
frame_index++;
}
system("pause");
#if USE_H264BSF
av_bitstream_filter_close(h264bsfc);
#endif
//Write file trailer
av_write_trailer(ofmt_ctx_a);
av_write_trailer(ofmt_ctx_v);
end:
avformat_close_input(&ifmt_ctx);
/* close output */
if (ofmt_ctx_a && !(ofmt_a->flags & AVFMT_NOFILE))
avio_close(ofmt_ctx_a->pb);
if (ofmt_ctx_v && !(ofmt_v->flags & AVFMT_NOFILE))
avio_close(ofmt_ctx_v->pb);
avformat_free_context(ofmt_ctx_a);
avformat_free_context(ofmt_ctx_v);
system("pause");
if (ret < 0 && ret != AVERROR_EOF) {
printf( "Error occurred.\n");
return -1;
}
return 0;
}EDIT 1
After reading through http://lists.libav.org/pipermail/libav-devel/2014-June/060048.html, I figured what was causing the"Using AVStream.codec.time_base as a timebase hint to the muxer is deprecated. Set AVStream.time_base instead"
. I fixed it by addingout_stream->time_base = in_stream->time_base;
before the call toavformat_write_header
. The code now runs without any error ! The h264 file created with the old FFMPEG (avcodec-55.dll) works fine while that created by the recent avcodec-57.dll is still invalid. -
C# FFMPEG : Code bugs out and stops producing media files
24 mai 2020, par HamezI've made a joke program in C# that uses ffmpeg to edit videos with different effects such as stuttering. I've finished 3 effects so far and each of them work on their own but as soon as I put one after another
e.g. fx.CrashStutter(0, 2); fx.CrashBeep(2, 2); fx.Wow(4, 2);

The code breaks and no longer produces photo/video files but once I stop debugging the file it was supposed to be processing appears. I've used a system where it loops over trying to execute a command to create a text file as a marker for when ffmpeg is done processing a file. The debug console also repeatedly says "The process tried to write to a nonexistent pipe."


Here's the code for all 3 effects :



public void Wow(double start, double duration)
 {
 if (fxstart == true)
 {
 //MessageBox.Show("WowFX Duration" + duration);
 string folderName = ("W_s" + start);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("mkdir " + folderName);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cd " + folderName);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("ffmpeg -ss " + start + " -t " + (duration / 6) + " -i " + source + " a.mp4");
 //wait until a.mp4 appears
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\a.txt") == false)
 {
 /*aha got a live one!*/FXcmd.StandardInput.WriteLine(" echo a > a.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -i a.mp4 -vf reverse -af areverse b.mp4");
 //wait until b.mp4 appears
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\b.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo b > b.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -ss " + start + " -t " + (duration / 3) + " -i " + source + " c.mp4");
 //wait until c.mp4 appears
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\c.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo c > c.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -i c.mp4 -vf reverse -af areverse d.mp4");
 //wait until d.mp4 appears
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\d.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo d > d.txt");
 System.Threading.Thread.Sleep(1500);
 }
 string[] concatList = { "file 'a.mp4'", "file 'b.mp4'", "file 'c.mp4'", "file 'd.mp4'" };
 //FXcmd.StandardInput.Write("del a.txt, b.txt, c.txt, d.txt");
 //System.Threading.Thread.Sleep(1000);
 System.IO.File.WriteAllLines(("FxSource(Temporary)\\" + folderName + "\\concatList.txt"), concatList);
 System.Threading.Thread.Sleep(1500);
 FXcmd.StandardInput.WriteLine("ffmpeg -f concat -i concatList.txt -c copy " + folderName + ".mp4");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\" + "1.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo 1 > 1.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("copy " + folderName + ".mp4 ..");
 while (File.Exists("FxSource(Temporary)\\" + folderName + ".mp4") == false)
 {
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("cd ..");
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cls");
 FXcmd.StandardInput.Flush();
 }
 }
 public void CrashStutter(int start, int duration)
 {
 if (fxstart == true)
 {
 string folderName = ("Cs_s" + start);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("mkdir " + folderName);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cd " + folderName);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("ffmpeg -ss " + start + " -t 0.1" + " -i " + source + " a.mp4");
 System.Threading.Thread.Sleep(100);
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\a.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo a > a.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -stream_loop "+10*duration+" -i a.mp4 "+folderName+".mp4");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\" + "1.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo 1 > 1.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("copy " + folderName + ".mp4 ..");
 while (File.Exists("FxSource(Temporary)\\" + folderName + ".mp4") == false)
 {
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("cd ..");
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cls");
 FXcmd.StandardInput.Flush();
 }
 }
 public void CrashBeep(int start, int duration)
 {
 //this effect cannot last longer than 7 seconds
 double contrast = 25;
 double red = 0.75;
 if (fxstart == true)
 {
 string folderName = ("Cb_s" + start);
 FXcmd.StandardInput.WriteLine("mkdir " + folderName);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cd " + folderName);
 System.Threading.Thread.Sleep(100);
 /*gets stuck*/FXcmd.StandardInput.WriteLine("ffmpeg -i "+source+ " -vf fps=1 a.jpg");
 System.Threading.Thread.Sleep(100);
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\a.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo a > a.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -i a.jpg -vf eq=contrast="+contrast+" b.jpg");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\b.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo b > b.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -i b.jpg -vf colorbalance=rm=" + red + " c.jpg");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\c.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo > c.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -loop 1 -i c.jpg -c:v libx264 -t "+ duration +" -pix_fmt yuv420p -vf scale=1920:1080 d.mp4");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\d.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo d > d.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("cd ..");
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("copy beep.mp3 "+folderName+"/beep.mp3");
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cd "+folderName);
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("ffmpeg -i beep.mp3 -ss 0 -t " + duration + " e.mp3");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\e.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo e > e.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("ffmpeg -i d.mp4 -i e.mp3 -c copy -map 0:v:0 -map 1:a:0 " + folderName + ".mp4");
 while (File.Exists("FxSource(Temporary)\\" + folderName + "\\" + "1.txt") == false)
 {
 FXcmd.StandardInput.WriteLine(" echo 1 > 1.txt");
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("copy " + folderName + ".mp4 ..");
 while (File.Exists("FxSource(Temporary)\\" + folderName + ".mp4") == false)
 {
 System.Threading.Thread.Sleep(1500);
 }
 FXcmd.StandardInput.WriteLine("cd ..");
 System.Threading.Thread.Sleep(100);
 FXcmd.StandardInput.WriteLine("cls");
 FXcmd.StandardInput.Flush();
 }
 }




Any suggestions ? Thanks !