es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ffmpeg cortar video con C API: ¿cómo lidiar con el problema de la pantalla negra?

Probé el código de Justin desde https://stackoverflow.com/questions/20856803/how-to-cut-video-with-ffmpeg-c-api, el sonido está bien pero no hay imagen. La información del archivo de salida ‘5_1.mp4’ es:

Entrada #0, mov, mp4, m4a, 3gp, 3g2, mj2, desde '5_1.mp4':
  Metadatos:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.65.101
  Duración: 00:00:09.93, inicio: 0.000000, tasa de bits: 677 kb/s
    Flujo #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 550 kb/s, 6.91 fps, 23.98 tbr, 90k tbn, 47.95 tbc (predeterminado)
    Metadatos:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
    Flujo #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, estéreo, fltp, 128 kb/s (predeterminado)
    Metadatos:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

Intenté utilizar ffmpeg con la línea de comandos ffmpeg -ss 00:00:00 -to 00:00:10 -i 5.mp4 -codec copy 5_0.mp4, genera una salida normal y la información del archivo de salida es:

Entrada #0, mov, mp4, m4a, 3gp, 3g2, mj2, desde '5_0.mp4':
  Metadatos:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.65.101
  Duración: 00:00:10.14, inicio: 0.000000, tasa de bits: 815 kb/s
    Flujo #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, 685 kb/s, 23.98 fps, 23.98 tbr, 2500k tbn, 47.95 tbc (predeterminado)
    Metadatos:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
    Flujo #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, estéreo, fltp, 128 kb/s (predeterminado)
    Metadatos:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

No pude encontrar dónde está el problema. ¿Cómo debo modificar el código para solucionar el problema de la pantalla negra?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, parece que el código original del post de StackOverflow no establece correctamente el códec de salida para el flujo de video. Esto podría resultar en un archivo de video sin imagen, pero con el audio correctamente codificado.

    Para modificar el código y solucionar el problema de la pantalla en negro, debemos asegurarnos de que el códec de salida esté correctamente configurado para el flujo de video. Una forma de hacer esto es establecer explícitamente el códec utilizando la función avformat_write_header(), como se muestra a continuación:

    // establecer el códec de video
    if (c->oformat->video_codec != AV_CODEC_ID_NONE) {
        codec = avcodec_find_encoder(c->oformat->video_codec);
        if (!codec) {
            fprintf(stderr, "Códec no encontrado\n");
            exit(1);
        }
        video_st = avformat_new_stream(c, NULL);
        if (!video_st) {
            fprintf(stderr, "No se pudo asignar el flujo\n");
            exit(1);
        }
        video_st->id = c->nb_streams-1;
        video_enc = avcodec_alloc_context3(codec);
        if (!video_enc) {
            fprintf(stderr, "No se pudo asignar el contexto del códec de video\n");
            exit(1);
        }
        video_enc->codec_id = c->oformat->video_codec;
        video_enc->bit_rate = in_video_codec_ctx->bit_rate;
        video_enc->width = in_video_codec_ctx->width;
        video_enc->height = in_video_codec_ctx->height;
        video_enc->time_base = in_video_codec_ctx->time_base;
        video_enc->pix_fmt = in_video_codec_ctx->pix_fmt;
        avcodec_parameters_from_context(video_st->codecpar, video_enc);
    }
    
    // escribir la cabecera del archivo
    avformat_write_header(c, NULL);
    

    Aquí, primero verificamos si el formato de salida tiene un códec de video especificado. Si es así, asignamos un nuevo flujo de video y un contexto de codificador, y establecemos los parámetros relevantes a partir del contexto del códec de entrada. Finalmente, llamamos a avformat_write_header() para escribir la cabecera del archivo con la configuración de códec correcta.

    Ten en cuenta que esta es solo una forma de asegurarse de que el códec de video de salida esté correctamente configurado. Dependiendo de los detalles específicos de tu caso de uso, es posible que se requieran otras modificaciones en el código.

Comments are closed.