
Recherche avancée
Autres articles (4)
-
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. -
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 -
XMP PHP
13 mai 2011, parDixit Wikipedia, XMP signifie :
Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)
Sur d’autres sites (3028)
-
ffmpeg unbale to initialize threading [closed]
16 octobre 2020, par Sudipta RoyI have a JAVA service running in wildfly which is calling an external ffmpeg binary to convert .au files to .wav files. The actual command that is being executed is as follows :


ffmpeg -y -i INPUT.au OUTPUT.wav



It is running smoothly, except every once in a while it is creating an empty .wav file becasue of the following error :


Error: ffmpeg version c6710aa Copyright (c) 2000-2017 the FFmpeg 
developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
configuration: --prefix=/tmp/ffmpeg-static/target --pkg-config-flags=- 
-static --extra-cflags=-I/tmp/ffmpeg-static/target/include --extra- 
ldflags=-L/tmp/ffmpeg-static/target/lib --extra-ldexeflags=-static -- 
bindir=/tmp/ffmpeg-static/bin --enable-pic --enable-ffplay --enable- 
ffserver --enable-fontconfig --enable-frei0r --enable-gpl --enable- 
version3 --enable-libass --enable-libfribidi --enable-libfdk-aac -- 
enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb -- 
enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus -- 
enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora - 
-enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis -- 
enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 -- 
enable-libxvid --enable-libzimg --enable-nonfree --enable-openssl
libavutil 55. 34.101 / 55. 34.101
libavcodec 57. 64.101 / 57. 64.101
libavformat 57. 56.101 / 57. 56.101
libavdevice 57. 1.100 / 57. 1.100
libavfilter 6. 65.100 / 6. 65.100
libswscale 4. 2.100 / 4. 2.100
libswresample 2. 3.100 / 2. 3.100
libpostproc 54. 1.100 / 54. 1.100

Input #0, ogg, from 'INPUT.au'
Duration: 00:00:34.08, start: 0.01500, bitrate: 15kb/s
Stream: #0.0: Audio: speex, 8000Hz, mono, s16, 15kb/s

[AVFilterGraph @ 0x43ec6e0] Error initializing threading.
[AVFilterGraph @ 0x43ec6e0] Error creating filter 'anull'



If I try to manually convert the file from command line, it works. A brief internet search (this) shows that it might be due to the fact that
ffmpeg
is unable to create threads for internal use. Can anyone please elaborate ?

The server where I am facing the problem have relatively high load. I have seen that wildfly is creating close to 1800 threads.


Thanks


P.s. I have managed to recreate the problem. Below is the code :


SystemCommandExecutor.java


import java.io.*;
 import java.util.List;
 public class SystemCommandExecutor {
 private List<string> commandInformation;
 private String adminPassword;
 private ThreadedStreamHandler inputStreamHandler;
 private ThreadedStreamHandler errorStreamHandler;

 public SystemCommandExecutor(final List<string> commandInformation)
 {
 if (commandInformation==null) throw new NullPointerException("The commandInformation is required.");
 this.commandInformation = commandInformation;
 this.adminPassword = null;
 }

 public int executeCommand()
 throws IOException, InterruptedException
 {
 int exitValue = -99;

 try
 {
 ProcessBuilder pb = new ProcessBuilder(commandInformation);
 Process process = pb.start();
 OutputStream stdOutput = process.getOutputStream();
 InputStream inputStream = process.getInputStream();
 InputStream errorStream = process.getErrorStream();
 inputStreamHandler = new ThreadedStreamHandler(inputStream, stdOutput, adminPassword);
 errorStreamHandler = new ThreadedStreamHandler(errorStream);
 inputStreamHandler.start();
 errorStreamHandler.start();
 exitValue = process.waitFor();
 inputStreamHandler.interrupt();
 errorStreamHandler.interrupt();
 inputStreamHandler.join();
 errorStreamHandler.join();
 }
 catch (IOException e)
 {
 throw e;
 }
 catch (InterruptedException e)
 {
 throw e;
 }
 finally
 {
 return exitValue;
 }
 }

 public StringBuilder getStandardOutputFromCommand()
 {
 return inputStreamHandler.getOutputBuffer();
 }

 public StringBuilder getStandardErrorFromCommand()
 {
 return errorStreamHandler.getOutputBuffer();
 }
}
</string></string>


ThreadedStreamHandler.java


import java.io.*;

class ThreadedStreamHandler extends Thread
{
 InputStream inputStream;
 String adminPassword;
 OutputStream outputStream;
 PrintWriter printWriter;
 StringBuilder outputBuffer = new StringBuilder();
 private boolean sudoIsRequested = false;

 
 ThreadedStreamHandler(InputStream inputStream)
 {
 this.inputStream = inputStream;
 }

 
 ThreadedStreamHandler(InputStream inputStream, OutputStream outputStream, String adminPassword)
 {
 this.inputStream = inputStream;
 this.outputStream = outputStream;
 this.printWriter = new PrintWriter(outputStream);
 this.adminPassword = adminPassword;
 this.sudoIsRequested = true;
 }

 public void run()
 {
 
 if (sudoIsRequested)
 {
 printWriter.println(adminPassword);
 printWriter.flush();
 }

 BufferedReader bufferedReader = null;
 try
 {
 bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
 String line = null;
 while ((line = bufferedReader.readLine()) != null)
 {
 outputBuffer.append(line + "\n");
 }
 }
 catch (IOException ioe)
 {
 ioe.printStackTrace();
 }
 catch (Throwable t)
 {
 t.printStackTrace();
 }
 finally
 {
 try
 {
 bufferedReader.close();
 }
 catch (IOException e)
 {
 // ignore this one
 }
 }
 }

 private void doSleep(long millis)
 {
 try
 {
 Thread.sleep(millis);
 }
 catch (InterruptedException e)
 {
 // ignore
 }
 }

 public StringBuilder getOutputBuffer()
 {
 return outputBuffer;
 }

}



FfmpegRunnable.java


import java.io.IOException;
import java.util.List;

public class FfmpegRunnable implements Runnable {
 private List<string> command;
 SystemCommandExecutor executor;

 public FfmpegRunnable(List<string> command) {
 this.command = command;
 this.executor = new SystemCommandExecutor(command);
 }

 @Override
 public void run() {
 try {
 int id = (int) Thread.currentThread().getId();
 int result = executor.executeCommand();
 if(result != 0) {
 StringBuilder err = executor.getStandardErrorFromCommand();
 System.out.println("[" + id + "]" + "[ERROR] " + err);
 } else {
 System.out.println("[" + id + "]" + "[SUCCESS]");
 }
 } catch (IOException e) {
 e.printStackTrace();
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
}
</string></string>


FfmpegMain.java


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
public class FfmpegMain {
 public static void main(String[] args) {
 //boolean threading = false;
 System.out.println(args[0]);
 int nrThread = Integer.parseInt(args[0]);
 boolean threading = Boolean.parseBoolean(args[1]);
 System.out.println("nrThread : " + nrThread + ", threading : " + threading);
 if(threading) {
 System.out.println("ffmpeg threading enabled");
 } else {
 System.out.println("ffmpeg threading not enabled");
 }
 ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(nrThread);
 for(int i=0; i cmd = new ArrayList<string>();
 String dest = "/tmp/OUTPUT/output_" + (Math.random()*1000) + ".wav";
 String cmdStr = "/tmp/FFMPEG/ffmpeg" + (threading ? " -threads 1 " : " ")
 + "-y -i /tmp/input.au " + dest;
 cmd.add("/bin/sh");
 cmd.add("-c");
 cmd.add(cmdStr);

 executor.submit(new FfmpegRunnable(cmd));
 }
 executor.shutdown();
 }
}
</string>


I have created a jar with the class files and run the jar from two seperate terminal with the following command


java -jar JAR.jar 40 true



Here 40 is the number of threads, simulating varous users accessing the system. Every once in a while I get above mentioned error.


-
Evolution #4567 : balise introduction
4 octobre 2020, par RastaPopoulos ♥Il y a déjà le filtre |introduction pour ça (utilisé par la balise) (le première argument est le descriptif, qu’on met donc ici à vide) : [(#VAL|introduction#TEXTE, 1000)]
-
Is there a way to batch split a file by chapter with ffmpeg and then reassemble with mkvmerge in windows ?
13 avril, par SipherdrakonSo I made a batch script originally with the ability to relatively precision trim a video into chapters without having to run by keyframes, but the code looks horrible and I can't get it to loop through all mp4 files nor get mkvmerge to append the files after splitting them. Code is below but be gentle it is my first try.


@echo off
setlocal enableDelayedExpansion

REM CODE BELOW CREATES JSON FILES FOR ALL MP4 FILES WITHIN THE SAME DIRECTORY
ffprobe -v quiet -print_format json -show_chapters -loglevel error "01x01.mp4" > "01x01.json"

REM CODE BELOW SETS VARIABLES FROM EACH SPECIFIC JSON
FOR /F "delims=" %%i in ('jq .chapters[2].start ^< 01x01.json') DO SET /A start1=%%i
FOR /F "delims=" %%j in ('jq .chapters[2].end ^< 01x01.json') DO SET /A end1=%%j

FOR /F "delims=" %%k in ('jq .chapters[4].start ^< 01x01.json') DO SET /A start2=%%k
FOR /F "delims=" %%l in ('jq .chapters[4].end ^< 01x01.json') DO SET /A end2=%%l

FOR /F "delims=" %%m in ('jq .chapters[6].start ^< 01x01.json') DO SET /A start3=%%m
FOR /F "delims=" %%n in ('jq .chapters[6].end ^< 01x01.json') DO SET /A end3=%%n

FOR /F "delims=" %%o in ('jq .chapters[8].start ^< 01x01.json') DO SET /A start4=%%o
FOR /F "delims=" %%p in ('jq .chapters[8].end ^< 01x01.json') DO SET /A end4=%%p

REM SETS THE DURATION OF EACH FILE TO USE PRECISION TIMING FOR START AND STOP TIMES
CALL vbs (%end1%-%start1%)/1000
SET duration1=%val%
CALL vbs (%end2%-%start2%)/1000
SET duration2=%val%
CALL vbs (%end3%-%start3%)/1000
SET duration3=%val%
CALL vbs (%end4%-%start4%)/1000
SET duration4=%val%

REM SETS THE START TIME IN SECONDS VS MILLISECONDS
CALL vbs (%start1%)/1000
SET start1=%val%
CALL vbs (%start2%)/1000
SET start2=%val%
CALL vbs (%start3%)/1000
SET start3=%val%
CALL vbs (%start4%)/1000
SET start4=%val%

REM TRIM AND SPLIT ORIGINAL FILE INTO SEPERATE SECTIONS BASED ON CHAPTER MARKERS
ffmpeg -ss %START1% -i 01x01.mp4 -ss 0 -c copy -to %DURATION1% -avoid_negative_ts make_zero 01x01-1.mp4
ffmpeg -ss %START2% -i 01x01.mp4 -ss 0 -c copy -to %DURATION2% -avoid_negative_ts make_zero 01x01-2.mp4
ffmpeg -ss %START3% -i 01x01.mp4 -ss 0 -c copy -to %DURATION3% -avoid_negative_ts make_zero 01x01-3.mp4
ffmpeg -ss %START4% -i 01x01.mp4 -ss 0 -c copy -to %DURATION4% -avoid_negative_ts make_zero 01x01-4.mp4

REM DELETES UNNEEDED JSON AFTER USE
del /s *.json

REM APPEND ALL MP4 FILES INTO COHESIVE MKV
for /d /r %%D in (*) do (
 pushd %%D
 set files=
 for %%F in (*.mp4) do set files=!files! + ^( "%%F" ^)
 if not "!files!"=="" %mkvmerge% -o "01x01-FINAL.mkv" !files:~2!
 popd
)

REM DELETE UNNEEDED MP4 ORIGINALS AND SPLIT FILES
del /s *.mp4



I know it is super long and every time I try to use a variable or a loop to run through all files it can't read the json file. I've been at this all day and I can use the script as is but I have to make a file for each iteration.


I was also hoping to be able to have it only pull chapters labeled as "video" but I haven't quite figured that one out yet.


I'll add the vbs batch file for the arithmetic section as well as the sample json if it will help.


@echo off
>"%temp%\VBS.vbs" echo Set fso = CreateObject("Scripting.FileSystemObject") : Wscript.echo (%*)
for /f "delims=" %%a in ('cscript /nologo "%temp%\VBS.vbs"') do set "val=%%a"
del "%temp%\VBS.vbs"



{
 "chapters": [
 {
 "id": 0,
 "time_base": "1/1000",
 "start": 0,
 "start_time": "0.000000",
 "end": 5590,
 "end_time": "5.590000",
 "tags": {
 "title": "Video"
 }
 },
 {
 "id": 1,
 "time_base": "1/1000",
 "start": 5590,
 "start_time": "5.590000",
 "end": 13994,
 "end_time": "13.994000",
 "tags": {
 "title": "Advertisement"
 }
 },
 {
 "id": 2,
 "time_base": "1/1000",
 "start": 13994,
 "start_time": "13.994000",
 "end": 163964,
 "end_time": "163.964000",
 "tags": {
 "title": "Video"
 }
 },
 {
 "id": 3,
 "time_base": "1/1000",
 "start": 163964,
 "start_time": "163.964000",
 "end": 195940,
 "end_time": "195.940000",
 "tags": {
 "title": "Advertisement"
 }
 },
 {
 "id": 4,
 "time_base": "1/1000",
 "start": 195940,
 "start_time": "195.940000",
 "end": 547849,
 "end_time": "547.849000",
 "tags": {
 "title": "Video"
 }
 },
 {
 "id": 5,
 "time_base": "1/1000",
 "start": 547849,
 "start_time": "547.849000",
 "end": 595850,
 "end_time": "595.850000",
 "tags": {
 "title": "Advertisement"
 }
 },
 {
 "id": 6,
 "time_base": "1/1000",
 "start": 595850,
 "start_time": "595.850000",
 "end": 1413588,
 "end_time": "1413.588000",
 "tags": {
 "title": "Video"
 }
 },
 {
 "id": 7,
 "time_base": "1/1000",
 "start": 1413588,
 "start_time": "1413.588000",
 "end": 1477569,
 "end_time": "1477.569000",
 "tags": {
 "title": "Advertisement"
 }
 },
 {
 "id": 8,
 "time_base": "1/1000",
 "start": 1477569,
 "start_time": "1477.569000",
 "end": 1529696,
 "end_time": "1529.696000",
 "tags": {
 "title": "Video"
 }
 }
 ]
}



I also tried using the start_time so I didn't have to do extra calculations but jq didn't like that either.


mkvmerge doesn't even try to run when I have it in here and I still need to cut 7 seconds off the end and 12 seconds off the front of it once it is all one file again.


Any help would be appreciated, I know it's a lot but I seem to have hit a roadblock or just sleep deprived at this point.


UPDATE


This works amazing I just need to figure out how to use files with spaces and I'm all set. I guess I could run a batch before hand replacing all spaces with underscores. That would probably work but I would like to not change filenames if I can help it.


@echo off

for %%i in (*.mp4) do (
FOR /F "delims=" %%A IN ('ffprobe -v quiet -print_format json -show_chapters -loglevel error "%%i" ^| xidel - -se "$json/(chapters)()[id!=0 and tags/title='Video']/concat('ffmpeg -ss ',start div 1000,' -i %%i -to ',((end - start) div 1000),' -c copy -avoid_negative_ts make_zero %%~ni-',position(),'.mp4')"') DO %%A
FOR /F "delims=" %%A IN ('xidel -s --xquery "concat('mkvmerge -o &quot;%%~ni-FINAL.mkv&quot; &quot;',join(file:list(.,false(),'%%~ni-*.mp4'),'&quot; + &quot;'),'&quot;')"') DO %%A
)