Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include FFmpeg in exported application? #67

Open
philipp-lehmann opened this issue Apr 29, 2021 · 15 comments
Open

Include FFmpeg in exported application? #67

philipp-lehmann opened this issue Apr 29, 2021 · 15 comments

Comments

@philipp-lehmann
Copy link

Hey there

Thanks for the effort putting together this awesome library.
I ran into troubles when exporting a standalone application from processing.

Can you include FFmpeg into the export, so that you don't have to install it separately when distributing the app?
I see that you can change the location, would it be possible to install ffmpeg within the data folder and point to this location?
Do you have other ideas?

Best Philipp

@hamoid
Copy link
Owner

hamoid commented May 1, 2021

Oh good point! Gee... I never considered exporting the application.

The library looks for its config file inside the Processing libraries folder, under VideoExport/settings.json
That file contains the path to ffmpeg. But I have no idea currently what happens with an exported app. I guess it still searches for that same file? Can you look if there is such a file in your exported app which you could edit?

@hamoid
Copy link
Owner

hamoid commented May 1, 2021

I see that after running the exported application once, a settings file is created in the same folder. You could try to put ffmpeg in a subfolder and then edit that settings.json file to point to it. A relative path might work.

@philipp-lehmann
Copy link
Author

philipp-lehmann commented May 1, 2021

Yes, I had the same idea, but couldn't fully test it yet.
Here's what i have observed so far with exported applications:

Win 10
The dialog pops up and asks for the file to be located, then the program runs correctly.
I'm not sure if this is also the case if the Environmental Variables (https://timrodenbroeker.de/processing-tutorial-video-export) haven't been set up correctly.

Mac OS
If FFmpeg is installed in the default directory, everything works as expected.
If not the application crashes. No dialogue.

I'll let you know if the relative paths work.

@hamoid
Copy link
Owner

hamoid commented May 1, 2021

I hope that by setting the path in settings.json the Environmental Variables are not needed.

Yes let me know how it goes. If it does I could add it to the readme :)

@philipp-lehmann
Copy link
Author

philipp-lehmann commented May 4, 2021

Hey there

Windows
Works with relative paths, even without the Environmental Variables.

@philipp-lehmann
Copy link
Author

philipp-lehmann commented May 11, 2021

MacOS

I think i have found a way. You can include the binaries in the exported app.
But the path in the settings.json has to be absolute, relative never worked for me.

Since the path changes when you move the App (or a different person installs it), I update the settings file when launching the App. Therefore I made a Settings.pde file with these functions.

void updateSettings() {
	String AppName = "App";
	String ffmpegPath = sketchPath(AppName + ".app/Contents/bin/ffmpeg");
	JSONObject json = loadJSONObject("settings.json");
	json.setString("ffmpeg_path", ffmpegPath);
	saveJSONObject(json, AppName + ".app/Contents/settings.json");
}

public String sketchPath(String where) {
	if (sketchPath() == null) {
		return where;
	}
	try {
		if (new File(where).isAbsolute()) return where;
	} catch (Exception e) {}
	return sketchPath() + File.separator + where;
}

Bildschirmfoto 2021-05-11 um 15 24 58

@philipp-lehmann
Copy link
Author

The updateSettings function could definitely be nicer and the appname is hardcoded at the moment.
But it works!

@philipp-lehmann
Copy link
Author

And when testing the sketch it creates a folder 'App.app/Contents' - not so nice.

@gritschu
Copy link

gritschu commented Sep 16, 2021

I am happy to find that I am not the only person who needs this. @philipp-lehmann thanks for your solution for Mac. However this doesn't seem to work for me. I am not sure why yet. The creation of the absolute path seems to work fine, but I think for me the call loadJSONObject("settings.json") seems to fail, thus I am not able to change the content of the json file via code at the moment. The folder structure is the same as in your screenshot if I don't miss something. Does someone have any idea? Thank you!

@gritschu
Copy link

I have hacked around my problem (in a messy way) and I am now able to change the absolute ffmpeg path in my settings.json file via code as described above.
However if I move my app to another folder / another computer and update the absolute path in the settings.json via my function accordingly, the path inside the file looks correct, but the dialogue window pops up anyway before the movie export starts to choose the ffmpeg location.
My big problem is now that on newer Mac OS systems the dialogue window will not pop up and the application will freeze, because Apple somehow prevents the dialogue to show up at all (some application access restrictions). I know this is rather a Mac OS issue than specifically relatd to this, but I wonder why the dialogue pops up at all even though the path is correctly set inside the json file. Any ideas?

@philipp-lehmann
Copy link
Author

Hey there

Clarifying on my earlier answer: There are two settings.json files. One is in the Data folder. On start I get the contents of this file as JSON, update the current app path, and the save it directly as a separate file into the App Folder.

void updateSettings() {
	updateAppPath();
	updateTargetPath();
}

// App path and ffmpeg location
void updateAppPath() {
	JSONObject ffmpgJSON = loadJSONObject("settings.json");
	String ffmpegPath = sketchPath(AppName + ".app/Contents/bin/ffmpeg");
	ffmpgJSON.setString("ffmpeg_path", ffmpegPath);
	saveJSONObject(ffmpgJSON, AppName + ".app/Contents/settings.json");
}

public String sketchPath(String where) {
	if (sketchPath() == null) {
		return where;
	}
	try {
		if (new File(where).isAbsolute()) return where;
	} catch (Exception e) {}
	return sketchPath() + File.separator + where;
}

// Target folder
void updateTargetPath() {
	JSONObject targetJSON = loadJSONObject("target.json");
	println("Target: " + targetJSON.getString("target_folder"));
	targetFolder = targetJSON.getString("target_folder");
}

void setTargetFolder() {
	selectFolder("Select a folder to write to:", "folderSelected");
}

void folderSelected(File selection) {
	if (selection == null) {
		println("No folder selected...");
	} else {
		// Apply target folder variable
		targetFolder = selection.getAbsolutePath() + "/";
		println("Target: " + targetFolder);

		// Create and save new target json
		JSONObject targetJSON = new JSONObject();
		targetJSON.setString("target_folder", targetFolder);
		targetJSON.setString("Test", "testvalue");
		saveJSONObject(targetJSON,  AppName + ".app/Contents/Java/data/target.json");
	}
}

@philipp-lehmann
Copy link
Author

I remember I also had the Issue, that the dialogue was hidden. And as you can see my current version is different, so I probably adressed this.

@gritschu
Copy link

@philipp-lehmann thank you so much!
I understand everything concerning the settings.json now.

However, I don't see a crucial difference in your current version from the one before which shall prevent the reappearing popup asking for selection of the ffmpeg path even though it has been updated inside the settings.json file.

The additional parts about the target path using the target.json has nothing to do with the issue, or does it?
If so, I don't understand where the original target.json file is coming from.

@gritschu
Copy link

Further observation:
If I change the path in the json file manually (open in editor, change, save) I don't have the problem.
I also don't have the problem, when I change the path in the json via code, then close my app, then reopen and export the movie.
The popup doesn't appear anymore and everything is fine.
Only if I change the path via
saveJSONObject(ffmpgJSON, AppName + ".app/Contents/settings.json");
and then try to export immediately after the popup opens again (which I want to prevent).

@philipp-lehmann
Copy link
Author

Yes, the target.json is a directory where I export the movies to.
This is not related to the ffmpeg import.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants