Compare commits
65 Commits
21a7cba7d5
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb019413cc | ||
|
|
40ca3e136b | ||
|
|
367cb440d8 | ||
|
|
c565699875 | ||
|
|
75f227786f | ||
|
|
960de11b1b | ||
|
|
e192c66157 | ||
|
|
23f1db5ffa | ||
|
|
362844f8a1 | ||
|
|
6ad2c3b50a | ||
|
|
ddec8633e3 | ||
|
|
c3943ff70e | ||
|
|
926ee16433 | ||
|
|
489435a87f | ||
|
|
efceec0e48 | ||
|
|
10234d67da | ||
|
|
7e5a500279 | ||
|
|
8aca12c422 | ||
|
|
b94f865831 | ||
|
|
48cc4f8a27 | ||
|
|
889b8dd6dc | ||
|
|
ffce9aecdf | ||
|
|
4dbf9d9c03 | ||
|
|
03922a76d2 | ||
|
|
f23423ca8d | ||
|
|
3681ff33f3 | ||
|
|
59b55bac6c | ||
|
|
2bf9b467bb | ||
|
|
6959e83327 | ||
|
|
2f425aa9cf | ||
|
|
556d88d73a | ||
|
|
af52c80a8e | ||
|
|
04d23ca1b2 | ||
|
|
88d9d15496 | ||
|
|
b1c58fc53a | ||
|
|
4070f34a60 | ||
|
|
cb600b920d | ||
|
|
bb5333ffca | ||
|
|
1ed4bbf6df | ||
|
|
9a8f97a278 | ||
|
|
650724c966 | ||
|
|
40592dcec2 | ||
|
|
da13f3e9c8 | ||
|
|
b4e304d9ab | ||
|
|
44d47a564c | ||
|
|
b8394069fb | ||
|
|
124772aaeb | ||
|
|
076e3c990b | ||
|
|
d549311e20 | ||
|
|
4a1bf64bda | ||
|
|
58ec094cfc | ||
|
|
0f46dc9fda | ||
|
|
cf4850c8dc | ||
|
|
ed0494b540 | ||
|
|
22592214bb | ||
|
|
0678716c1c | ||
|
|
685365388e | ||
|
|
4bd294e26b | ||
|
|
840aa5c41f | ||
|
|
9f9e17e6ca | ||
|
|
77b7638573 | ||
|
|
28933b8281 | ||
|
|
73c44f0da3 | ||
|
|
7b491c6af4 | ||
|
|
35e4e76e2f |
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
*.pcm
|
||||
*.ppm
|
||||
*.ts
|
||||
*.mkv
|
||||
part*
|
||||
venv/
|
||||
2
Makefile
Normal file
2
Makefile
Normal file
@@ -0,0 +1,2 @@
|
||||
clean:
|
||||
rm -f *.ppm *.pcm part* *.srt *-ts.txt *-full.h264 *-novideo.mkv fre.*
|
||||
52
README.md
52
README.md
@@ -1,3 +1,51 @@
|
||||
# removeads
|
||||
# Goal of the script
|
||||
|
||||
Remove ads from TV recordings with optimal cuts.
|
||||
Remove ads from TV recordings with optimal cuts with single video frame precision.
|
||||
|
||||
When I record a movie on TV, I sometimes wish to archive the movie on my NAS.
|
||||
In that case, I want to remove (at least) the beginning and the end of the recording
|
||||
if the movie was broadcast on a advertisment free channel, or even worse I may
|
||||
have to split it in numerous parts so as to remove the advertisments.
|
||||
And I do not want to reencode the entire movie since it's a really slow process (on my NAS)
|
||||
and the movie is already broadcast using H264 (DVB-T).
|
||||
|
||||
Doing this by hand is really painful, because most tools like ffmpeg, or mkvmerge are only
|
||||
able to cut a movie (without reencoding) at a boundary within the video stream that corresponds
|
||||
to a reference frame (so called I-frames). These frames are only present roughly every 10-20 frames
|
||||
which corresponds to quite long duration (in the order of a second).
|
||||
|
||||
I really want to cut the movie with a better precision. So I have written a Python script
|
||||
that leverages _ffmpeg_, _ffprobe_ and _mkvmerge_, _subvodocr_ to do the job with the required precision.
|
||||
|
||||
# Parameters
|
||||
|
||||
# How does it work ?
|
||||
|
||||
The processing follows a quite long pipeline:
|
||||
|
||||
1. The original .ts file is first transformed into an .mp4 file using _ffmpeg_ to correct timestamps:
|
||||
|
||||
2. The .mp4 is then transformed into a Matroska container (which is the default container) still using _ffmpeg_:
|
||||
|
||||
3. Then the movie is then cut using the indications passed as parameters. It is possible to give as many parts as needed.
|
||||
|
||||
Each part is treated with the same algorithm.
|
||||
Trouver l'estampille de la trame 'I' la plus proche (mais postérieure) au début de la portion.
|
||||
Trouver l'estampille de la trame 'I' la plus proche (mais antérieure) à la fin de la portion.
|
||||
On a alors
|
||||
debut ----- trame --------- trame --------- fin.
|
||||
'B/P' 'B/P'* 'I' 'I' 'B/P'* 'B/P'
|
||||
Si la trame de début est déjà 'I', il n'y a rien à faire (idem pour la fin).
|
||||
Sinon on extrait les trames 'B' ou 'P' depuis le début jusqu'à la trame 'I' non incluse
|
||||
|
||||
4. Then each part that have been previously obtained are merged using _mkvmerge_:
|
||||
|
||||
5. The subtitles (image based) are then extracted using _mkvextract_:
|
||||
|
||||
6. These images are then processed using _vobsubocr_ to create SRT files:
|
||||
|
||||
7. The SRT files are then remuxed inside the Matroska container using _mkvmerge_:
|
||||
|
||||
# How to determine where to cuts
|
||||
|
||||
Use `mpv --osd-fractions --osd-level=3 ./movie.ts`
|
||||
|
||||
7
empty.idx
Normal file
7
empty.idx
Normal file
@@ -0,0 +1,7 @@
|
||||
# VobSub index file, v7 (do not modify this line!)
|
||||
size: 720x480
|
||||
palette: 000000, 0000ff, 00ff00, ff0000, ffff00, ff00ff, 00ffff, ffffff, 808000, 8080ff, 800080, 80ff80, 008080, ff8080, 555555, aaaaaa
|
||||
langidx: 0
|
||||
|
||||
id: fr, index: 0
|
||||
timestamp: 00:00:00:000, filepos: 000000000
|
||||
3619
removeads.py
3619
removeads.py
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,6 @@
|
||||
xmltodict
|
||||
requests
|
||||
pygame
|
||||
coloredlogs
|
||||
tqdm
|
||||
iso639-lang
|
||||
hexdump
|
||||
|
||||
Reference in New Issue
Block a user