Skip to content
Snippets Groups Projects
Commit 6d3bdc7e authored by Sofiane Lasri's avatar Sofiane Lasri
Browse files

amélioration de la gestion des paramètres

parent 05bcc64c
Branches
Tags
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<multipleDevicesSelectedInDropDown value="true" />
<runningDeviceTargetsSelectedWithDialog>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="R3CR60HNFLW" />
</Key>
</deviceKey>
</Target>
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
......@@ -21,6 +11,7 @@
</Key>
</deviceKey>
</Target>
</runningDeviceTargetsSelectedWithDialog>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-04-15T17:09:08.556417400Z" />
</component>
</project>
\ No newline at end of file
......@@ -32,7 +32,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'com.arthenica:ffmpeg-kit-full:4.5.1-1'
implementation 'com.arthenica:ffmpeg-kit-full-gpl:4.5.1-1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
......
......@@ -11,6 +11,7 @@ import android.content.pm.PackageManager;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
......@@ -27,6 +28,8 @@ import com.arthenica.ffmpegkit.FFmpegSession;
import com.arthenica.ffmpegkit.ReturnCode;
import java.io.File;
import java.util.LinkedList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
......@@ -93,7 +96,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
intent.setType("video/*");
startActivityForResult(intent, 123);
}else if(v == encodeVideoBtn){
Log.d("MainActivity", "Encode video");
Log.i("MainActivity", "Encode video");
// On va vérifier que l'utilisateur a renté une taille de fichier
if(targetFileSizeInput.getText().toString().equals("")){
Toast.makeText(this, "Veuillez rentrer une taille de fichier", Toast.LENGTH_SHORT).show();
......@@ -107,7 +110,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}
// On peut lancer l'encodage
encodeVideo(video_url, targetFileSizeInput.getText().toString(), encodeQuality.getSelectedItem().toString());
encodeVideo(video_url, Integer.parseInt(targetFileSizeInput.getText().toString()), encodeQuality.getSelectedItem().toString());
}
}
......@@ -177,7 +180,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
retriever.setDataSource(video_url);
String time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long timeInMillisec = Long.parseLong(time);
return (int) timeInMillisec;
return (int) (timeInMillisec / 1000);
}
public Integer getVideoSizeInBytes(String video_url) {
......@@ -187,22 +190,22 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}
// Fonction de conversion
public void encodeVideo(String video_url, String targetFileSize, String quality) {
public void encodeVideo(String video_url, Integer targetFileSize, String quality) {
// On récupère la taille cible du fichier selon l'unité choisie
Integer targetFileSizeInKiloBit = 0;
if(sizeUnit.getSelectedItem().toString().equals("Mo")) {
targetFileSizeInKiloBit = Integer.parseInt(targetFileSize) * 1000 * 8;
targetFileSizeInKiloBit = targetFileSize * 1000 * 8;
}else if(sizeUnit.getSelectedItem().toString().equals("MB")) {
targetFileSizeInKiloBit = Integer.parseInt(targetFileSize) * 1000 * 8;
targetFileSizeInKiloBit = targetFileSize * 1000 * 8;
}else{
Toast.makeText(this, "Unité de taille \"" + sizeUnit.getSelectedItem().toString() + "\" non reconnue. M", Toast.LENGTH_SHORT).show();
}
// On va appliquer une marge de 10% à la taille cible
targetFileSizeInKiloBit = (int) targetFileSizeInKiloBit * 9 / 10;
Log.d("targetFileSizeInKiloBit", targetFileSizeInKiloBit.toString());
//targetFileSizeInKiloBit = (int) (targetFileSizeInKiloBit * (9 / 10));
Log.i("targetFileSizeInKiloBit", targetFileSizeInKiloBit.toString());
// On récupère la durée de la vidéo
Integer videoDurationInSeconds = getVideoDurationInSeconds(video_url);
Log.i("videoDurationInSeconds", videoDurationInSeconds.toString());
// On regarde si on garde l'audio ou pas
Integer audioBitrate = 0; // en kBits
......@@ -211,30 +214,124 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
}
// On va calculer le bitrate de la video en fonction de la bande son
Integer videoBitrate = (int) (targetFileSizeInKiloBit / videoDurationInSeconds) - audioBitrate;
Integer videoBitrate = (int) ((targetFileSizeInKiloBit / videoDurationInSeconds) - audioBitrate);
Log.i("videoBitrate", videoBitrate.toString());
// On regarde si a notre dossier de créé
File folder = new File(Environment.getExternalStorageDirectory() + "/SL-Video Compressor/");
if(!folder.exists()) {
folder.mkdir();
}
String outputFileName = folder.getAbsolutePath() + "/" + video_url.substring(this.video_url.lastIndexOf("/") + 1, this.video_url.lastIndexOf(".")) + "_" + targetFileSize + "_" + quality + ".mp4";
String logPath = "'" + folder.getAbsolutePath() + "/'";
// On supprime le fichier s'il existe déjà
File file = new File(outputFileName);
if(file.exists()) {
file.delete();
}
String outputFileName = video_url.substring(0, video_url.length() - 4) + "_" + targetFileSize + "_" + quality + ".mp4";
String ffmpegCommand = "-i " + video_url + " -b:v " + videoBitrate + "k -c:a aac -b:a " + audioBitrate + "k " + outputFileName;
Log.d("FFMPEG", ffmpegCommand);
// FFMPEG
List<String> pass1Commands = new LinkedList<>();
pass1Commands.add("-y");
pass1Commands.add("-i");
pass1Commands.add('"' + video_url + '"');
pass1Commands.add("-codec:v");
pass1Commands.add("libx264");
pass1Commands.add("-passlogfile");
pass1Commands.add(logPath);
pass1Commands.add("-preset");
pass1Commands.add(encodeQuality.getSelectedItem().toString());
pass1Commands.add("-b:v");
pass1Commands.add(videoBitrate.toString() + "k");
pass1Commands.add("-maxrate");
pass1Commands.add(videoBitrate.toString() + "k");
pass1Commands.add("-bufsize");
pass1Commands.add("1000k");
pass1Commands.add("-pass");
pass1Commands.add("1");
pass1Commands.add("-an");
pass1Commands.add("-f");
pass1Commands.add("null");
pass1Commands.add("-");
String ffmpegCommand = "";
for(String command : pass1Commands) {
ffmpegCommand += command + " ";
}
Log.i("FFMPEG", ffmpegCommand);
// On lance l'encodage
Toast.makeText(this, "Encodage en cours...", Toast.LENGTH_SHORT).show();
encodeVideoBtn.setEnabled(false);
FFmpegSession session = FFmpegKit.execute(ffmpegCommand);
if (ReturnCode.isSuccess(session.getReturnCode())) {
FFmpegSession firstPass = FFmpegKit.execute(ffmpegCommand);
if (ReturnCode.isSuccess(firstPass.getReturnCode())) {
// SUCCESS
Toast.makeText(this, "1ère passe terminée", Toast.LENGTH_SHORT).show();
} else if (ReturnCode.isCancel(firstPass.getReturnCode())) {
// CANCEL
} else {
// FAILURE
Log.i("Main", String.format("Command failed with state %s and rc %s.%s", firstPass.getState(), firstPass.getReturnCode(), firstPass.getFailStackTrace()));
Toast.makeText(this, "Erreur lors de l'encodage de la 1ère passe", Toast.LENGTH_SHORT).show();
}
List<String> pass2Commands = new LinkedList<>();
pass2Commands.add("-i");
pass2Commands.add('"' + video_url + '"');
pass2Commands.add("-codec:v");
pass2Commands.add("libx264");
pass2Commands.add("-passlogfile");
pass2Commands.add(logPath);
pass2Commands.add("-preset");
pass2Commands.add(encodeQuality.getSelectedItem().toString());
pass2Commands.add("-b:v");
pass2Commands.add(videoBitrate.toString() + "k");
pass2Commands.add("-maxrate");
pass2Commands.add(videoBitrate.toString() + "k");
pass2Commands.add("-bufsize");
pass2Commands.add("1000k");
pass2Commands.add("-pass");
pass2Commands.add("2");
// On regarde si on garde la piste audio
if(deleteSoundTrack.isChecked()) {
pass2Commands.add("-c:a");
pass2Commands.add("aac");
pass2Commands.add("-b:a");
pass2Commands.add(audioBitrate.toString() + "k");
}
pass2Commands.add("'" + outputFileName + "'");
ffmpegCommand = "";
for(String command : pass2Commands) {
ffmpegCommand += command + " ";
}
Log.i("FFMPEG", ffmpegCommand);
FFmpegSession secondPass = FFmpegKit.execute(ffmpegCommand);
if (ReturnCode.isSuccess(firstPass.getReturnCode())) {
// SUCCESS
Toast.makeText(this, "Encodage terminé: " + outputFileName, Toast.LENGTH_LONG).show();
} else if (ReturnCode.isCancel(session.getReturnCode())) {
} else if (ReturnCode.isCancel(secondPass.getReturnCode())) {
// CANCEL
} else {
// FAILURE
Log.d("Main", String.format("Command failed with state %s and rc %s.%s", session.getState(), session.getReturnCode(), session.getFailStackTrace()));
Toast.makeText(this, "Erreur lors de l'encodage de la vidéo", Toast.LENGTH_SHORT).show();
Log.i("Main", String.format("Command failed with state %s and rc %s.%s", secondPass.getState(), secondPass.getReturnCode(), secondPass.getFailStackTrace()));
Toast.makeText(this, "Erreur lors de l'encodage de la 2nd passe", Toast.LENGTH_SHORT).show();
}
encodeVideoBtn.setEnabled(true);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment