First run ffmpeg -i file.mp4
to see which streams exists in your file. You should see something like this:
Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr, 23.98 tbn, 23.98 tbc
Stream #0.1: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Stream #0.2: Audio: ac3, 48000 Hz, 5.1, s16, 384 kb/s
Then run ffmpeg -i file.mp4 -map 0:0 -map 0:2 -acodec copy -vcodec copy new_file.mp4
to copy video stream and 2nd audio stream to new_file.mp4
.
This is very similar to @goldilock's approach but, IMO, simpler and can deal with empty lines in the file and replaces |
with a line break :
#!/usr/bin/env perl
my ($time, $text, $next_time, $next_text);
my ($c,$i)=0;
while (<>) {
## skip bad lines
next unless /^\s*([:\d]+)\s*:(.+)/;
## If this is the first line. I could have used $. but this is
## safer in case the file contains an empty line at the beginning.
if ($c == 0) {
$time=$1;
$text=$2;
$c++;
}
else {
## This is the counter for the subtitle index
$i++;
## Save the current values
$next_time=$1;
$next_text=$2;
## I am assuming that the | should be interpreted
## as a newline, remove this if I'm wrong.
$text=~s/\|/\n/g;
## Print the previous subttitle
print "$i\n$time,100 --> $next_time,000\n$text\n\n";
## Save the current one for the next line
$time=$next_time; $text=$next_text;
}
}
## Print the last subtitle. It will be dislayed for a minute
## 'cause I'm lazy.
$i++;
$time=~/(\d+:)(\d+)(:\d+)/;
my $newtime=$1 . (sprintf "%02d", $2+1) . $3;
print "$i\n$time,100 --> $newtime,000\n$text\n\n";
Save the script as a file and make it executable, then run:
./script.pl subfile > good_subs.srt
The output I get on your sample was:
1
00:00:44,100 --> 00:01:01,000
" Myślę, więc jestem".
Kartezjusz, 1596-1650
2
00:01:01,100 --> 00:01:06,000
Trzynaste Pietro
3
00:01:06,100 --> 00:01:10,000
Podobno niewiedza uszczęśliwia.
4
00:01:10,100 --> 00:01:13,000
Po raz pierwszy w życiu
zgadzam się z tym.
5
00:01:13,100 --> 00:01:15,000
Wolałbym...
6
00:01:15,100 --> 00:01:19,000
nigdy nie odkryć
tej straszliwej prawdy.
7
00:01:19,100 --> 00:02:19,000
Teraz już wiem...
Best Answer
The Matroska (mkv) container format supports text-based subtitles embedded as a separate stream into the file.
You could use mkvmerge to remux the file to .mkv and include the subtitles in the output, which you can enable/disable when playing the video. Note that this method will NOT re-encode the video or audio, it's just putting the same data into a different container format, so it will not decrease the quality of the video.