024 FFmpeg – Convertire DVD e contenuti speciali in formato mp4

13 Luglio, 2020 (20:35) | Fotografia digitale, Linux | By: sargonsei

Se vogliamo convertire l’intero contenuto di un DVD in un file video formato MP4 mantenendo inalterata la qualità dell’audio e del video, possiamo utilizzare il comando
ffmpeg -i /dev/sr0 -q:a 0 -q:v 0 ContenutoDVD.mp4 # Converte un intero DVD in un video formato MP4 mantenendo inalterata la qualità audio e video
Otterremo così un file video avente nome “ContenutoDVD.mp4” contenente non sono solo i files video relativi al film, ma anche i menù video, i contenuti extra, ed ogni altro contenuto multimediale eventualmente presente nel DVD.

Ora spiego come usare FFmpeg per estrarre i contenuti del DVD che ci interessano e convertirli in uno o più files video formato MP4.

    La guida che segue, è pensata per convertire dei video che ancora si trovano nel DVD e mettere i video convertiti nella cartella in cui è stato aperto il terminale.

Qualora i video da convertire si trovassero in una qualsiasi altra cartella di una qualsiasi altra memoria di massa, occorre modificare di conseguenza il percorso di ciascun file video da copiare.
Qualora si desideri salvare i video in output in una qualsiasi altra cartella di una qualsiasi altra memoria di massa, occorre modificare di conseguenza il percorso di ciascun file video in output, oppure spostare i video dopo averli creati.
Qualora si desideri semplificare le operazioni contenute nello script, è possibile creare una cartella vuota, e copiarvi i soli files .VOB che si desidera convertire; in questo modo, sarà possibile sia omettere le righe dello script che copiano i files .VOB. In un secondo tempo, si potrà provvedere a spostare nella cartella di destinazione definitiva i files video da conservare e cancellare i files che non interessa conservare.

1) Utilizzando il file-manager, accedere alla cartella ‘VIDEO_TS‘ del DVD per visualizzarne il contenuto. I files video, sono quelli avente estensione ‘.VOB‘.

2) Utilizzare un qualsiasi Video Player (es. VLC) per visualizzare i singoli files ‘.VOB‘ in modo da poter determinare quali ci interessa convertire ed a cosa sono relativi. Nel caso in esempio, ci interessano i files ‘VTS_09_1.VOB‘, ‘VTS_09_2.VOB‘, e ‘VTS_09_3.VOB‘ perchè relativi al video principale,
ed il file ‘VTS_05_1‘ perchè relativo a contenuti extra che si desidera estrarre.

3) Utilizzando il file-manager, creiamo la cartella in cui vogliamo salvare i video convertiti, ci spostiamo al suo interno, e creiamo il file ListaDVD.txt contenente la lista dei files .MP4 che si vuole unire nel file video principale. Nel caso in esame, contiene:
file 'Parte1.MP4'
file 'Parte3.MP4'
file 'Parte3.MP4'

4) Apriamo un terminale nella cartella del DVD ove si trovano i video che ci interessano e, al fine di ottenere informazioni relativi ai video che ci interessa convertire, impartiamo il comando
ffmpeg -i VTS_09_1.VOB -hide_banner ; ffmpeg -i VTS_09_2.VOB -hide_banner ; ffmpeg -i VTS_09_3.VOB -hide_banner ; ffmpeg -i VTS_05_1.VOB -hide_banner
ed esaminiamo l’output. Vediamo che tutti e 4 i video hanno risoluzione 720×576 pixels, formato 4:3, 25 fps. Infatti:

 $ ffmpeg -i VTS_09_1.VOB -hide_banner ; ffmpeg -i VTS_09_2.VOB -hide_banner ; ffmpeg -i VTS_09_3.VOB -hide_banner ; ffmpeg -i VTS_05_1.VOB -hide_banner
Guessed Channel Layout for Input Stream #0.2 : stereo
Input #0, mpeg, from 'VTS_09_1.VOB':
  Duration: 00:16:38.94, start: 0.360000, bitrate: 8597 kb/s
    Stream #0:0[0x1bf]: Data: dvd_nav_packet
    Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bottom first), 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:2[0xa0]: Audio: pcm_dvd, 48000 Hz, stereo, s16, 1536 kb/s
At least one output file must be specified
[mpeg2video @ 0x564981e12440] Invalid frame dimensions 0x0.
    Last message repeated 2 times
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, mpeg, from 'VTS_09_2.VOB':
  Duration: 00:16:31.66, start: 999.298333, bitrate: 8660 kb/s
    Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, smpte170m/bt470bg/bt470bg, bottom first), 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0xa0]: Audio: pcm_dvd, 48000 Hz, stereo, s16, 1536 kb/s
    Stream #0:2[0x1bf]: Data: dvd_nav_packet
At least one output file must be specified
[mpeg2video @ 0x5577416a1440] Invalid frame dimensions 0x0.
    Last message repeated 3 times
Guessed Channel Layout for Input Stream #0.1 : stereo
Input #0, mpeg, from 'VTS_09_3.VOB':
  Duration: 00:03:22.75, start: 1990.895000, bitrate: 8552 kb/s
    Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, smpte170m/bt470bg/bt470bg, bottom first), 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0xa0]: Audio: pcm_dvd, 48000 Hz, stereo, s16, 1536 kb/s
    Stream #0:2[0x1bf]: Data: dvd_nav_packet
At least one output file must be specified
Guessed Channel Layout for Input Stream #0.2 : stereo
Input #0, mpeg, from 'VTS_05_1.VOB':
  Duration: 00:06:22.12, start: 0.360000, bitrate: 7896 kb/s
    Stream #0:0[0x1bf]: Data: dvd_nav_packet
    Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bottom first), 720x576 [SAR 16:15 DAR 4:3], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:2[0xa0]: Audio: pcm_dvd, 48000 Hz, stereo, s16, 1536 kb/s
At least one output file must be specified
$

5a) Per converte un file video ‘.VOB‘ in un video formato ‘MP4‘ utilizzando il codec video ‘libx264‘ ed il codec audio ‘aac‘, è sufficiente utilizzare un comando tipo
ffmpeg -i Input.VOB -vcodec libx264 -filter:v fps=25 -acodec aac Output.MP4 # Converte il file video '.VOB' in un video formato 'MP4', utilizzando codec video: 'libx264' e codec audio: 'aac'

5b) Appurato che i video in formato .VOB da convertire in formato .MP4 hanno tutti proporzione 4/3 (risoluzione: 720×576), per poterli vedere con un televisore formato 16/9 senza deformazioni, potrebbe essere indispensabile porli al centro di un riquadro formato 16/9 alto 576 pixels e largo (576*16/9)=1024 pixels in modo che appaiano (1024-720)/2= 152 pixels più a destra rispetto lo spigolo superiore sinistro del video. FFmpeg permette di raggiungere questo risultato impartendo un comando tipo:
ffmpeg -i Input.VOB -vf pad=width=1024:height=576:x=152:y=0:color=red Output.mp4 # Converte nel formato .MP4 il video 'Input.VOB' e lo pone al centro di un riquadro alto 576 pixels e largo 1024 pixels in modo che inizi (1024-720)/2= 152 pixels più a destra rispetto lo spigolo superiore sinistro del video.

5c) I due comandi precedenti, possono essere integrati in un unico comando tipo
ffmpeg -i Input.VOB -vcodec libx264 -filter:v fps=25 -acodec aac -vf pad=width=1024:height=576:x=152:y=0:color=red Output.mp4 # Utilizza codec video: 'libx264' e codec audio: 'aac' per converte il file video '.VOB' proporzione 4/3 (risoluzione: 720x576) in un file video '.MP4' e lo pone al centro di un riquadro alto 576 pixels e largo 1024 pixels in modo che inizi (1024-720)/2= 152 pixels più a destra rispetto lo spigolo superiore sinistro del video.

6) Nella cartella in cui vogliamo salvare i video convertiti, creiamo il file ‘ComandiDVD.txt‘ contenente:

#!/bin/bash
# Utilizza codec video: 'libx264' e codec audio: 'aac' per converte alcuni file video '.VOB' proporzione 4/3 (risoluzione: 720x576)
# in file video '.MP4' posti al centro di un riquadro proporzione 16/9 alto 576 pixels e largo 1024 pixels
# in modo che inizi (1024-720)/2= 152 pixels più a destra rispetto lo spigolo superiore sinistro del video
# e poi concatena files video elencati nel file 'ListaDVD.txt'
#
# Per poter eseguire i 4 comandi seguenti, occorre che il DVD sia inserito nel lettore DVD del computer
cp /media/lmde3c/Punto_Di_Mount_DVD/VIDEO_TS/VTS_05_1.VOB VTS_05_1.VOB
cp /media/lmde3c/Punto_Di_Mount_DVD/VIDEO_TS/VTS_09_1.VOB Parte1.VOB
cp /media/lmde3c/Punto_Di_Mount_DVD/VIDEO_TS/VTS_09_2.VOB Parte2.VOB
cp /media/lmde3c/Punto_Di_Mount_DVD/VIDEO_TS/VTS_09_2.VOB Parte2.VOB
#
# Da questo punto in poi, è possibile togliere il DVD dal lettore DVD del computer
#
ffmpeg -i VTS_05_1.VOB -vcodec libx264 -filter:v fps=25 -acodec aac -vf pad=width=1024:height=576:x=152:y=0:color=green ContExtra.MP4
ffmpeg -i Parte1.VOB -vcodec libx264 -filter:v fps=25 -acodec aac -vf pad=width=1024:height=576:x=152:y=0:color=green Parte1.MP4
ffmpeg -i Parte2.VOB -vcodec libx264 -filter:v fps=25 -acodec aac -vf pad=width=1024:height=576:x=152:y=0:color=green Parte2.MP4
ffmpeg -i Parte3.VOB -vcodec libx264 -filter:v fps=25 -acodec aac -vf pad=width=1024:height=576:x=152:y=0:color=green Parte3.MP4
#
# I due comandi che seguono sono alternativi l'uno all'altro
# ffmpeg -f concat -i ListaDVD.txt DVDout0.MP4 # crea un video formato 'MP4' unendo i files video elencati nel file 'ListaDVD.txt', utilizzando i parametri di default in base al formato del video in input e del video in output
ffmpeg -f concat -i ListaDVD.txt -vcodec libx264 -filter:v fps=25 -acodec aac -s 1024x576 DVDout1.MP4 # Crea un video formato 'MP4' unendo i files video elencati nel file 'ListaDVD.txt', utilizzando codec video: 'libx264' e codec audio: 'aac'
#
#

7) Salvare il file di testo ComandiDVD.txt così ottenuto.

8) Cliccare col tasto destro del mouse sul file di testo ComandiDVD.txt, selezionare [Proprietà]>[Permessi], ed assicurarsi che la voce “Consentire l’esecuzione del file come programma” sia selezionata.

9) Doppio click col tasto sinistro del mouse sul file di testo ComandiDVD.txt; nel pannello che si apre, selezionare la voce “Esegui nel terminale”.

A questo punto, lo script si attiverà, eseguendo una dopo l’altra i comandi ivi contenuti.