
Recherche avancée
Autres articles (112)
-
Personnaliser en ajoutant son logo, sa bannière ou son image de fond
5 septembre 2013, parCertains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;
-
Ecrire une actualité
21 juin 2013, parPrésentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
Vous pouvez personnaliser le formulaire de création d’une actualité.
Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...) -
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir
Sur d’autres sites (5272)
-
On-demand and seamless transcoding of individual HLS segments
5 janvier 2024, par Omid AriyanBackground


I've been meaning to implement on-demand transcoding of certain video formats such as ".mkv", ".wmv", ".mov", etc. in order to serve them on a media management server using ASP.NET Core 6.0, C# and ffmpeg.


My Approach


The approach I've decided to use is to serve a dynamically generated .m3u8 file which is simply generated using a segment duration of choice e.g. 10s and the known video duration. Here's how I've done it. Note that the resolution is currently not implemented and discarded :


public string GenerateVideoOnDemandPlaylist(double duration, int segment)
{
 double interval = (double)segment;
 var content = new StringBuilder();

 content.AppendLine("#EXTM3U");
 content.AppendLine("#EXT-X-VERSION:6");
 content.AppendLine(String.Format("#EXT-X-TARGETDURATION:{0}", segment));
 content.AppendLine("#EXT-X-MEDIA-SEQUENCE:0");
 content.AppendLine("#EXT-X-PLAYLIST-TYPE:VOD");
 content.AppendLine("#EXT-X-INDEPENDENT-SEGMENTS");

 for (double index = 0; (index * interval) < duration; index++)
 {
 content.AppendLine(String.Format("#EXTINF:{0:#.000000},", ((duration - (index * interval)) > interval) ? interval : ((duration - (index * interval)))));
 content.AppendLine(String.Format("{0:00000}.ts", index));
 }

 content.AppendLine("#EXT-X-ENDLIST");

 return content.ToString();
}

[HttpGet]
[Route("stream/{id}/{resolution}.m3u8")]
public IActionResult Stream(string id, string resolution)
{
 double duration = RetrieveVideoLengthInSeconds();
 return Content(GenerateVideoOnDemandPlaylist(duration, 10), "application/x-mpegURL", Encoding.UTF8);
}



Here's an example of how the .m3u8 file looks like :


#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-INDEPENDENT-SEGMENTS
#EXTINF:10.000000,
00000.ts
#EXTINF:3.386667,
00001.ts
#EXT-X-ENDLIST



So the player would ask for 00000.ts, 00001.ts, etc. and the next step is to have them generated on demand :


public byte[] GenerateVideoOnDemandSegment(int index, int duration, string path)
{
 int timeout = 30000;
 int totalWaitTime = 0;
 int waitInterval = 100;
 byte[] output = Array.Empty<byte>();
 string executable = "/opt/homebrew/bin/ffmpeg";
 DirectoryInfo temp = Directory.CreateDirectory(System.IO.Path.Combine(System.IO.Path.GetTempPath(), System.IO.Path.GetRandomFileName()));
 string format = System.IO.Path.Combine(temp.FullName, "output-%05d.ts");

 using (Process ffmpeg = new())
 {
 ffmpeg.StartInfo.FileName = executable;

 ffmpeg.StartInfo.Arguments = String.Format("-ss {0} ", index * duration);
 ffmpeg.StartInfo.Arguments += String.Format("-y -t {0} ", duration);
 ffmpeg.StartInfo.Arguments += String.Format("-i \"{0}\" ", path);
 ffmpeg.StartInfo.Arguments += String.Format("-c:v libx264 -c:a aac ");
 ffmpeg.StartInfo.Arguments += String.Format("-segment_time {0} -reset_timestamps 1 -break_non_keyframes 1 -map 0 ", duration);
 ffmpeg.StartInfo.Arguments += String.Format("-initial_offset {0} ", index * duration);
 ffmpeg.StartInfo.Arguments += String.Format("-f segment -segment_format mpegts {0}", format);

 ffmpeg.StartInfo.CreateNoWindow = true;
 ffmpeg.StartInfo.UseShellExecute = false;
 ffmpeg.StartInfo.RedirectStandardError = false;
 ffmpeg.StartInfo.RedirectStandardOutput = false;

 ffmpeg.Start();

 do
 {
 Thread.Sleep(waitInterval);
 totalWaitTime += waitInterval;
 }
 while ((!ffmpeg.HasExited) && (totalWaitTime < timeout));

 if (ffmpeg.HasExited)
 {
 string filename = System.IO.Path.Combine(temp.FullName, "output-00000.ts");

 if (!File.Exists(filename))
 {
 throw new FileNotFoundException("Unable to find the generated segment: " + filename);
 }

 output = File.ReadAllBytes(filename);
 }
 else
 {
 // It's been too long. Kill it!
 ffmpeg.Kill();
 }
 }

 // Remove the temporary directory and all its contents.
 temp.Delete(true);

 return output;
}

[HttpGet]
[Route("stream/{id}/{index}.ts")]
public IActionResult Segment(string id, int index)
{
 string path = RetrieveVideoPath(id);
 return File(GenerateVideoOnDemandSegment(index, 10, path), "application/x-mpegURL", true);
}
</byte>


So as you can see, here's the command I use to generate each segment incrementing -ss and -initial_offset by 10 for each segment :


ffmpeg -ss 0 -y -t 10 -i "video.mov" -c:v libx264 -c:a aac -segment_time 10 -reset_timestamps 1 -break_non_keyframes 1 -map 0 -initial_offset 0 -f segment -segment_format mpegts /var/folders/8h/3xdhhky96b5bk2w2br6bt8n00000gn/T/4ynrwu0q.z24/output-%05d.ts



The Problem


Things work on a functional level, however the transition between segments is slightly glitchy and especially the audio has very short interruptions at each 10 second mark. How can I ensure the segments are seamless ? What can I improve in this process ?


-
Concat video files using ffmpeg in individual subfolders with shell script [closed]
18 août 2022, par WeatherdarkI had a Windows script that would do what I want, but I switched my server to Unraid so now I need a new script. Anyway, enough backstory.


I regularly have media that is named in a style like "Videoname CD(Number).ext". They get stored in subfolders called Videoname with a different folder for each video.


What I need is a script that goes through each subfolder and creates a concat.txt file with the names of each video file ending in CD(number) in it, in numerical order, that will then call ffmpeg to concat the files using the concat.txt in each subfolder, placing the video file (named after the subfolder) into a folder like /mnt/User/Pool/Finished/Videofile. Then, hopefully it will delete the concat.txt file so I know which folders are finished with a quick look.


I know the ffmpeg concat options for that part, I just have no idea what to use to make sure the resulting video file is named after the subfolder it came from.


I could do this in Windows (albeit in a hacky, not very pretty way), but I have no idea how to accomplish this in Linux.


As an example...




/mnt/User/Pool/Concat/10.10.2022.0034.Recording/10.10.2022.0034.Recording
CD1.mp4
/mnt/User/Pool/Concat/10.10.2022.0034.Recording/10.10.2022.0034.Recording
CD2.mp4
/mnt/User/Pool/Concat/10.10.2022.0034.Recording/10.10.2022.0034.Recording
CD3.mp4
/mnt/User/Pool/Concat/10.10.2022.0034.Recording/10.10.2022.0034.Recording
CD4.mp4
/mnt/User/Pool/Concat/10.11.2022.0254.Recording/10.11.2022.0254.Recording
CD1.mp4
/mnt/User/Pool/Concat/10.11.2022.0254.Recording/10.11.2022.0254.Recording
CD2.mp4
/mnt/User/Pool/Concat/10.11.2022.0254.Recording/10.11.2022.0254.Recording
CD3.mp4
/mnt/User/Pool/Concat/10.11.2022.0254.Recording/10.11.2022.0254.Recording
CD4.mp4


Put through ffmpeg to concat, results in files


/mnt/User/Pool/Finished/10.10.2022.0034.Recording.mp4


/mnt/User/Pool/Finished/10.11.2022.0254.Recording.mp4




Hopefully that makes sense.


Someone closed this because it wasn't "focused enough" and didn't focus on one thing... but there is ONLY one thing that it needs to do.


I have no idea what they would want me to change to fix what isn't broken, so I fundamentally am at a loss. The script just needs to search through subfolders, create a concat.txt file and send that file to ffmpeg creating the new file, named after the folder, in a new location. That is literally as focused as I can make it.


-
ffmpeg +libx264 iPhone -> 'avcodec_encode_video' return always 0 . please advice
2 janvier 2014, par isaiahav_register_all();
AVCodec *codec ; AVCodecContext *c= NULL ; int out_size, size, outbuf_size ; //FILE *f ; uint8_t *outbuf ;
printf("Video encoding\n") ;
/* find the mpeg video encoder */
codec =avcodec_find_encoder(CODEC_ID_H264) ;//avcodec_find_encoder_by_name("libx264") ; //avcodec_find_encoder(CODEC_ID_H264) ;//CODEC_ID_H264) ;
NSLog(@"codec = %i",codec) ;
if (!codec)
fprintf(stderr, "codec not found\n") ;
exit(1) ;
c= avcodec_alloc_context() ;/* put sample parameters */
c->bit_rate = 400000 ;
c->bit_rate_tolerance = 10 ;
c->me_method = 2 ;
/* resolution must be a multiple of two */
c->width = 352 ;//width ;//352 ;
c->height = 288 ;//height ;//288 ;
/* frames per second */
c->time_base= (AVRational)1,25 ;
c->gop_size = 10 ; /* emit one intra frame every ten frames */
//c->max_b_frames=1 ;
c->pix_fmt = PIX_FMT_YUV420P ;c ->me_range = 16 ;
c ->max_qdiff = 4 ;
c ->qmin = 10 ;
c ->qmax = 51 ;
c ->qcompress = 0.6f ;'avcodec_encode_video' is always 0 .
I guess that because 'non-strictly-monotonic PTS' warning, do you konw same situation ?