diff --git a/src/iotro.rs b/src/iotro.rs
index 4f987984aa7344d8db43911ae7bb802f98996aac..94eca890fea03cc148b68ab3451d54a487fd8277 100644
--- a/src/iotro.rs
+++ b/src/iotro.rs
@@ -13,16 +13,18 @@ use svgwriter::{
 
 #[derive(Clone)]
 pub struct Language<'a> {
-	lang: &'a str,
-	format_date_long: fn(Date) -> String,
+	pub(crate) lang: &'a str,
+	pub(crate) format_date_long: fn(Date) -> String,
 	// intro
 	lecture_from: &'a str,
-	video_created_by_us: &'a str,
+	pub(crate) video_created_by_us: &'a str,
 	// outro
 	video_created_by: &'a str,
 	our_website: &'a str,
 	download_videos: &'a str,
-	questions_feedback: &'a str
+	questions_feedback: &'a str,
+	// metadata
+	pub(crate) from: &'a str
 }
 
 pub const GERMAN: Language<'static> = Language {
@@ -54,7 +56,9 @@ pub const GERMAN: Language<'static> = Language {
 	video_created_by: "Video erstellt von der",
 	our_website: "Website der Fachschaft",
 	download_videos: "Videos herunterladen",
-	questions_feedback: "Fragen, Vorschläge und Feedback"
+	questions_feedback: "Fragen, Vorschläge und Feedback",
+
+	from: "vom"
 };
 
 pub const BRITISH: Language<'static> = Language {
@@ -88,10 +92,13 @@ pub const BRITISH: Language<'static> = Language {
 
 	lecture_from: "Lecture from",
 	video_created_by_us: "Video created by the Video AG, Fachschaft I/1",
+
 	video_created_by: "Video created by the",
 	our_website: "The Fachschaft's website",
 	download_videos: "Download videos",
-	questions_feedback: "Questions, Suggestions and Feedback"
+	questions_feedback: "Questions, Suggestions and Feedback",
+
+	from: "from"
 };
 
 impl Default for Language<'static> {
diff --git a/src/main.rs b/src/main.rs
index 862fb427e0a4c7112fa015fb3fc02e5bb17df762..6c9a7ee049c869ec2d80930e04db1e31d6d159cd 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -369,7 +369,7 @@ fn main() {
 				continue;
 			}
 			if !project.progress.transcoded.contains(&res) {
-				videos.push(renderer.rescale(res).unwrap());
+				videos.push(renderer.rescale(&project.lecture, res).unwrap());
 				project.progress.transcoded.insert(res);
 
 				fs::write(&project_path, toml::to_string(&project).unwrap().as_bytes())
diff --git a/src/render/ffmpeg.rs b/src/render/ffmpeg.rs
index a0288ab706a4fb0a8b4c519974b4de1228960bf2..0213a26c8649761cb5109050615d8511fd25ce22 100644
--- a/src/render/ffmpeg.rs
+++ b/src/render/ffmpeg.rs
@@ -74,6 +74,14 @@ pub(crate) struct FfmpegOutput {
 	pub(crate) fps_mode_vfr: bool,
 	pub(crate) faststart: bool,
 
+	// video container metadata
+	pub(crate) title: Option<String>,
+	pub(crate) author: Option<String>,
+	pub(crate) album: Option<String>,
+	pub(crate) year: Option<String>,
+	pub(crate) comment: Option<String>,
+	pub(crate) language: Option<String>,
+
 	pub(crate) path: PathBuf
 }
 
@@ -83,11 +91,20 @@ impl FfmpegOutput {
 			format,
 			audio_bitrate: None,
 			video_bitrate: None,
+
 			fps: None,
 			duration: None,
 			time_base: None,
 			fps_mode_vfr: false,
 			faststart: false,
+
+			title: None,
+			author: None,
+			album: None,
+			year: None,
+			comment: None,
+			language: None,
+
 			path
 		}
 	}
@@ -161,6 +178,17 @@ impl FfmpegOutput {
 		if self.faststart {
 			cmd.arg("-movflags").arg("+faststart");
 		}
+
+		// metadata
+		macro_rules! add_meta {
+			($this:ident, $cmd:ident: $($meta:ident),+) => {
+				$(if let Some(value) = $this.$meta.as_deref() {
+					$cmd.arg("-metadata").arg(format!("{}={}", stringify!($meta), value));
+				})+
+			}
+		}
+		add_meta!(self, cmd: title, author, album, year, comment, language);
+
 		cmd.arg(self.path);
 	}
 }
diff --git a/src/render/mod.rs b/src/render/mod.rs
index cfb79d8e65b3dd02091c3aec1164b5ba79806a75..012ff2c022f7657be3328bbb0b152551d1703898 100644
--- a/src/render/mod.rs
+++ b/src/render/mod.rs
@@ -9,7 +9,7 @@ use crate::{
 	iotro::{intro, outro},
 	render::ffmpeg::{Ffmpeg, FfmpegInput},
 	time::{format_date, Time},
-	Project, ProjectSourceMetadata, Resolution
+	Project, ProjectLecture, ProjectSourceMetadata, Resolution
 };
 use anyhow::{bail, Context};
 use camino::{Utf8Path as Path, Utf8PathBuf as PathBuf};
@@ -501,13 +501,30 @@ impl<'a> Renderer<'a> {
 		Ok(output)
 	}
 
-	pub fn rescale(&self, res: Resolution) -> anyhow::Result<PathBuf> {
+	pub fn rescale(
+		&self,
+		lecture: &ProjectLecture,
+		res: Resolution
+	) -> anyhow::Result<PathBuf> {
 		let input = self.video_file_output();
 		let output = self.video_file_res(res);
 		println!("\x1B[1m ==> Rescaling to {}p\x1B[0m", res.height());
 
 		let mut ffmpeg = Ffmpeg::new(FfmpegOutput {
 			video_bitrate: Some(res.bitrate()),
+
+			title: Some(format!(
+				"{} {} {}",
+				lecture.label,
+				lecture.lang.from,
+				(lecture.lang.format_date_long)(lecture.date)
+			)),
+			author: Some(lecture.docent.clone()),
+			album: Some(lecture.course.clone()),
+			year: Some(lecture.date.year.to_string()),
+			comment: Some(lecture.lang.video_created_by_us.into()),
+			language: Some(lecture.lang.lang.into()),
+
 			..FfmpegOutput::new(res.format(), output.clone()).enable_faststart()
 		});
 		ffmpeg.add_input(FfmpegInput::new(input));