Découpage automatique des fichiers mpg lors de la capture

Échanges entre les développeurs et les utilisateurs au sujet du développement logiciel de Pouchin TV Mod. Les participants sont présumés avoir des connaissances raisonnables en matière de programmation informatique.
Répondre
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Découpage automatique des fichiers mpg lors de la capture

Message par mekp »

D'abord bravo pour ce programme PTVM qui est très convivial
et qui m'a fait renoncer définitivement au programme 'Pinnacle TV Center pro'
(j'ai une carte Pinnacle PCTV Hybrid Pro PCI).

Je propose d'ajouter, à une prochaine version de PTVM,
la possibilité de découper automatiquement les fichiers mpg enregistrés lors de la capture
selon une taille paramètrable par l'utilisateur.

Cela permettrais d'enregistrer plus de 4 Go consécutifs sur une partition FAT32.

Cela pourrais se faire d'une façon équivalente à ce que fait le logiciel VirtualDub
en nommant ainsi la liste des fichiers : nom.01.mpg , nom.02.mpg , nom.03.mpg , etc .

A bientôt.
Gingko
Administrateur du site et développeur
Messages : 2058
Enregistré le : 05 août 2007, 12:57
Carte Tuner : August DVB-T210 USB + divers autres
Êtes-vous un robot ? : Je ne suis pas un robot
Localisation : Pantin (IDF, 93)
Contact :

Re: Découpage automatique des fichiers mpg lors de la captur

Message par Gingko »

mekp a écrit :D'abord bravo pour ce programme PTVM qui est très convivial
et qui m'a fait renoncer définitivement au programme 'Pinnacle TV Center pro'
(j'ai une carte Pinnacle PCTV Hybrid Pro PCI).

Je propose d'ajouter, à une prochaine version de PTVM,
la possibilité de découper automatiquement les fichiers mpg enregistrés lors de la capture
selon une taille paramètrable par l'utilisateur.

Cela permettrais d'enregistrer plus de 4 Go consécutifs sur une partition FAT32.

Cela pourrais se faire d'une façon équivalente à ce que fait le logiciel VirtualDub
en nommant ainsi la liste des fichiers : nom.01.mpg , nom.02.mpg , nom.03.mpg , etc .
Bonjour,

Ceci a déjà été évoqué une ou deux fois ailleurs dans ce forum, je crois, et il y a déjà un certain temps.

C'est sans doute possible, mais ce n'est pas très évident à faire « proprement » (autrement dit, de telle sorte qu'il n'y ait pas une rupture visible ou audible au moment du raccord).

Gingko
Gingko
․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․
Tuners utilisés, sur 3 ordis : • USB : August DVB-T210, AverMedia HDTV DVB-T Volar (2×) • PCI : Hauppauge Nova-DT Dual DVB-T • Express Card : AverMedia Digi Express 54
mekp
Messages : 14
Enregistré le : 20 juin 2010, 15:06
Carte Tuner : pinnacle PCTV hybrid pro pci
Êtes-vous un robot ? : Je ne suis pas un robot

Re: Découpage automatique des fichiers mpg lors de la captur

Message par mekp »

*****************************************************************************************************
j'ai fait une modification de PouchinTVmod pour permettre de capturer
plus de 4 Go en PS (.mpg) sur des partitions FAT32 en splittant le fichier de capture
en plusieurs fichiers < 4 Go (taille paramètrable)
*****************************************************************************************************
  • il faut noter que chaque fichier 'splitté' n'est pas un fichier .mpg valide !!!!!
  • il faudra concaténer les fichiers 'splittés' pour obtenir un fichier .mpg valide !!!!!
    (sur une partition NTFS s'il doit dépasser 4 Go)
  • au lieu d'un fichier de capture unique (par exemple : nom.mpg)
    on aura plusieurs fichiers : nom.mpg.001, nom.mpg.002, nom.mpg.003, etc
Les modifications sont les suivantes :
  • ajout d'un fichier de paramètres de type texte
  • modification des fichiers capture.cpp et ini.cpp
****************************************************************************************************************
***** ajout d'un fichier 'lettresFAT32.txt' dans le même répertoire que PouchinTVMod.exe *****
****************************************************************************************************************
  • exemple de contenu :
    CSW
    2000000000
ce qui veut dire :
  • qu'il y aura split pour les partitions C: , S: et W:
  • que la taille maximum des fichiers 'splittés' est 2000000000 (presque 2 Go)
  • si ce genre de modification interesse suffisament de personnes
    on pourrait envisager de modifier le fichier 'config.ini'
    au lieu d'utiliser le fichier spécifique 'lettresFAT32.txt'
*************************************************************
***** ajout vers le début du fichier capture.cpp *****
*************************************************************

Code : Tout sélectionner

// ----- variables ajoutées pour le split du fichier de capture -----
extern TCHAR nom_init[MAX_PATH]; // declaré en global
extern unsigned int written_all, written_all_max; // declaré en global
extern int nusufx; // declaré en global
*****************************************************************************************
***** modif du module CCapture::ecrit_fichier(...) du fichier capture.cpp *****
*****************************************************************************************

Code : Tout sélectionner

BOOL CCapture::ecrit_fichier(LPCVOID pBuf, DWORD sizBuf) const
{
	DWORD written;

	// ----- mise en commentaire pour le split du fichier de capture -----
	// return WriteFile(hFile, pBuf, sizBuf, &written, NULL);
	// ----- partie ajoutée pour le split du fichier de capture -----
	BOOL result;
	result = WriteFile(hFile, pBuf, sizBuf, &written, NULL);
	if ( nusufx == -1 ) return result;
	written_all = written_all+written;
	if ( written_all > written_all_max ) {
		TCHAR nom_new[MAX_PATH];
		nusufx++;
		swprintf(nom_new, L"%s.%3.3d", nom_init, nusufx);
		CloseHandle(hFile);
		CreateFile(nom_new, GENERIC_WRITE, FILE_SHARE_READ, NULL,
			CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		written_all = 0;
	}
	return result;
	// ----- fin de la partie ajoutée -----
}
******************************************************
***** ajout vers le début du fichier ini.cpp *****
******************************************************

Code : Tout sélectionner

// ----- variables ajoutées pour le split du fichier de capture -----
TCHAR nom_init[MAX_PATH]; // declaré en global
unsigned int written_all, written_all_max; // declaré en global
int nusufx; // declaré en global
// ----- fin des variables ajoutées
****************************************************************************************
**** modif du module NomFichierAvecDate::Create() du fichier ini.cpp *****
****************************************************************************************

Code : Tout sélectionner

HANDLE NomFichierAvecDate::Create() const
{
	// ----- partie ajoutée pour initialiser le split du fichier de capture -----
	FILE *fd;
	char FileLetterFat[300], LettersFat[20], nom_mbs[100], LetterFile, chwrittenmax[20];
	wchar_t cmdline[300];
	char *ptch;
	int itmp, i_last_slash;
	bool do_split_file;
	LPTSTR lpszCommandLine = ::GetCommandLine();
	wcscpy(cmdline, lpszCommandLine);
	wcstombs(&FileLetterFat[0], cmdline, sizeof(cmdline));

	strcat(FileLetterFat, " ");
	if ( FileLetterFat[0] == '"' ) {
		memmove(&FileLetterFat[0] , &FileLetterFat[1], strlen(FileLetterFat)); // elimine 1ere double quote
		ptch = strchr(FileLetterFat, '"');
		if ( ptch != NULL ) *ptch = 0; // elimine 2eme double quote et ce qui suit
	} else {
		ptch = strchr(FileLetterFat, ' ');
		if ( ptch != NULL ) *ptch = 0; // elimine espace et ce qui suit
	}
	i_last_slash = -1;
	for (itmp = 0; itmp < (int)strlen(FileLetterFat); itmp++) {
		if ( FileLetterFat[itmp] == 92 ) i_last_slash = itmp; // 92 : anti-slash
	}
	if ( i_last_slash == -1 ) {
		// cas ou il n'y a pas de répertoire devant le nom de l'exécutable
		FileLetterFat[0] = 0;
	} else {
		FileLetterFat[i_last_slash+1] = 0;
	}
	strcpy(FileLetterFat, "lettresFAT32.txt");

	do_split_file = false;
	fd = fopen(FileLetterFat, "r");
	if ( fd != NULL ) {
		// fichier présent, il doit contenir :
		// - en 1ere ligne : une liste de lettres (par exemple : CSW)
		//   correspondant aux lettres de lecteurs associées à des partitions FAT32
		//   ou même à des partitions NTFS pour lesquelles on veut splitter le fichier
		// - en 2eme ligne : la taille maximum en octets à partir de laquelle
		//   on splitte le fichier (par exemple : 2000000000 pour presque 2 Go)
		//   la 2eme ligne est facultative (dans ce cas 2000000000 est pris par défaut)
		fgets(LettersFat, sizeof(LettersFat), fd);
		if ( LettersFat[strlen(LettersFat)-1] == 10 ) LettersFat[strlen(LettersFat)-1] = 0;
		strupr(LettersFat); // converti en majuscules
		if ( fgets(chwrittenmax, sizeof(chwrittenmax), fd) != NULL ) {
			if ( chwrittenmax[strlen(chwrittenmax)-1] == 10 ) chwrittenmax[strlen(chwrittenmax)-1] = 0;
			sscanf(chwrittenmax, "%d", &written_all_max);
		} else {
			written_all_max = 2000000000; // presque 2 Go
		}
		fclose(fd);
		wcstombs(&nom_mbs[0], nom, sizeof(nom));
		if ( nom_mbs[1] == ':' ) {
			// cas de nom de fichier absolu (par exemple : C:\dir\file)
			// le cas de nom de fichier relatif (par exemple : dir1\file) n'est pas traité
			LetterFile = nom_mbs[0];
			if ( LetterFile >= 97 ) LetterFile = LetterFile-32; // converti en majuscules
			if ( strchr(LettersFat, nom_mbs[0]) != NULL ) {
				// cas ou la lettre est dans la liste LettersFat
				do_split_file = true; 
			}
		}
	}

	if ( do_split_file == false ) {
		nusufx = -1; // pour désactiver le découpage du fichier capturé
	} else {
		written_all = 0;
		nusufx = 1;
		wcscpy(nom_init, nom);
		TCHAR nom_new[MAX_PATH];
		swprintf(nom_new, L"%s.%3.3d", nom_init, nusufx);
		return CreateFile(nom_new, GENERIC_WRITE, FILE_SHARE_READ, NULL,
			CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	}
	// ----- fin de la partie ajoutée -----
	
	return CreateFile(nom, GENERIC_WRITE, FILE_SHARE_READ, NULL,
		CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}
Gingko
Administrateur du site et développeur
Messages : 2058
Enregistré le : 05 août 2007, 12:57
Carte Tuner : August DVB-T210 USB + divers autres
Êtes-vous un robot ? : Je ne suis pas un robot
Localisation : Pantin (IDF, 93)
Contact :

Re: Découpage automatique des fichiers mpg lors de la captur

Message par Gingko »

mekp a écrit :*****************************************************************************************************
j'ai fait une modification de PouchinTVmod pour permettre de capturer
plus de 4 Go en PS (.mpg) sur des partitions FAT32 en splittant le fichier de capture
en plusieurs fichiers < 4 Go (taille paramètrable)
*****************************************************************************************************

[……]
Bonjour,

Merci pour votre contribution et votre intérêt pour Pouchin TV Mod.

J'ai déplacé votre message dans la section « Développement », et je me suis également permis un certain reformatage de son texte, essentiellement pour faire ressortir les indentations du code.

Le problème du découpage des fichiers .mpg est justement de faire une coupure propre entre les deux fichiers.

Ce qui n'est d'ailleurs pas évident à faire, étant donnée la nature des images de type « B » qui sont des interpolations bidirectionnelles entre deux images de type « I » ou « P » : le fichier devant nécessairement débuter et se terminer par une image complète, la réplication de la même image s'imposera en fin d'un fichier et au début du suivant, et le raccordement ultérieur de deux fichiers ainsi découpés résultera au mieux en une image en double (ou bien en deux images perdues), sauf à recoder les deux ou trois dernières images, opération beaucoup plus complexe.

Gingko
Gingko
․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․ ․
Tuners utilisés, sur 3 ordis : • USB : August DVB-T210, AverMedia HDTV DVB-T Volar (2×) • PCI : Hauppauge Nova-DT Dual DVB-T • Express Card : AverMedia Digi Express 54
Répondre