/* esp_bn.c * compilación * $ gcc -o esp_bn esp_bn.c * Uso: * $ ./esp_bn * * Descarga un video de YouTube una sola vez * y lo envía dos procesos FFmpeg: * 1. FFmpeg aplica hflip y genera video_esp.mp4 * 2. FFmpeg convierte a blanco y negro y genera video_bn.mp4 * * El programa C actúa como intermediario entre los procesos. */ #include #include #include #include int main(int argc, char *argv[]) { char buffer[2048]; FILE *download; FILE *flip; FILE *bw; size_t nread; if (argc != 2) { fprintf(stderr, "Uso: %s \n", argv[0]); exit (EXIT_FAILURE); } /* * --------------------------------------------------------- * 1. yt-dlp descarga el video y escribe en stdout. * --------------------------------------------------------- */ snprintf(buffer, sizeof(buffer),"yt-dlp -q -o - \"%s\"", argv[1]); printf("Iniciando descarga ...\n"); download = popen(buffer, "r"); if (download == NULL) exit(1); /* * --------------------------------------------------------- * 2. Proceso FFmpeg para espejar el video (hflip) * --------------------------------------------------------- */ flip = popen("ffmpeg -loglevel error -i pipe:0 -vf \"hflip\" video_esp.mp4", "w"); if (flip == NULL) { pclose(download); exit(EXIT_FAILURE); } /* * --------------------------------------------------------- * 3. Proceso FFmpeg para el video blanco y negro. * La saturación se elimina con hue=s=0. * --------------------------------------------------------- */ bw = popen("ffmpeg -loglevel error -i pipe:0 -vf \"hue=s=0\" video_bn.mp4", "w"); if (bw == NULL) { pclose(download); pclose(flip); exit(EXIT_FAILURE); } /* * --------------------------------------------------------- * 4. Leer cada dato bajado por download * y lo envía a los dos procesos FFmpeg. * --------------------------------------------------------- */ while (1) { nread = fread(buffer, 1, sizeof(buffer), download); if (nread == 0) break; fwrite(buffer, 1, nread, flip); fwrite(buffer, 1, nread, bw); } /* Cerrar stdin de los dos FFmpeg. * * Esto es importante: al recibir EOF, FFmpeg puede * terminar la codificación y cerrar correctamente * los archivos MP4. * Cerrar la pipe de yt-dlp. */ pclose(flip); pclose(bw); pclose(download); exit(EXIT_SUCCESS); }