Points de connaissance d'appel de fonction de ffmpeg

Que signifie l'impression av_dump_format ?

av_dump_format imprimera le contenu de AVFormatContext, que signifie le contenu imprimé ?

Nous utilisons av_dump_format pour imprimer les informations suivantes :

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'https://demo.com/BigBuckBunny.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isomavc1mp42
    creation_time   : 2010-01-10T08:29:06.000000Z
  Duration: 00:09:56.47, start: 0.000000, bitrate: 2119 kb/s
    Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.
    Stream #0:1(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1991 kb/s, 24 fps, 24 tbr, 24k tbn, 48 tbc (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.

Quel est le format de conteneur pour les fichiers ?

"mov,mp4,m4a,3gp,3g2,mj2" indique l'extension supportée par le format conteneur (Container Format) du fichier d'entrée.

Dans les fichiers multimédias, les formats de conteneur sont utilisés pour organiser et stocker plusieurs flux audio et vidéo et d'autres données associées. Différents formats de conteneur prennent en charge différentes extensions de fichier. Ces extensions sont utilisées pour indiquer le format et le type du fichier.

Dans l'exemple de sortie, "mov,mp4,m4a,3gp,3g2,mj2" indique que le fichier d'entrée est un format de conteneur qui prend en charge ces extensions. La signification spécifique est la suivante :

  • "mov" : fichier QuickTime Movie, généralement utilisé sur la plate-forme macOS.

  • « mp4 » : fichier MPEG-4 Part 14, qui est un format de conteneur multimédia courant largement utilisé pour stocker des données audio et vidéo.

  • « m4a » : fichier audio MPEG-4 pour stocker des données audio.

  • « 3gp » : fichiers de projet de partenariat de 3e génération pour la lecture audio et vidéo sur des appareils mobiles.

  • "3g2": fichier 3rd Generation Partnership Project 2, une version améliorée de 3GP.

  • « mj2 » : fichier Motion JPEG 2000 pour le stockage de vidéo basé sur la compression JPEG 2000.

Par conséquent, "mov,mp4,m4a,3gp,3g2,mj2" indique que le fichier d'entrée est un fichier qui prend en charge ces formats de conteneur, et le type et le format du fichier peuvent être déduits de l'extension de fichier.

Le format de fichier multimédia est relativement général, pour être précis, il doit être divisé en deux formats, format d'encodage + format de conteneur.

Cela équivaut à ce que nous pouvons utiliser des assiettes pour servir des légumes, et nous pouvons également utiliser des assiettes pour servir du riz.

Nous pouvons utiliser différents formats de conteneurs pour contenir différents formats d'encodage. (Bien sûr, il existe également des réglementations ici. Il existe des exigences claires pour lesquelles les formats d'encodage sont autorisés à être contenus dans un certain format de conteneur)

Ce format de conteneur est également le suffixe de fichier que nous voyons tous les jours.

Dans la sortie ici, nous avons plusieurs formats de conteneurs, indiquant que nous autorisons le contenu téléchargé par cette URL réseau à être stocké dans des formats de fichiers tels que mov/mp4/m4a.

Quelles informations contiennent les métadonnées ?

Dans av_dump_format()les informations de sortie, la section "Métadonnées" contient des informations de métadonnées, qui sont utilisées pour décrire les attributs spécifiques et les données associées du fichier multimédia. Vous trouverez ci-dessous une explication de chaque champ :

  • major_brand: Indique la marque principale du fichier. Il indique "meilleur" en fonction du format d'analyse du fichier actuel. Dans l'exemple, "mp42" signifie que la marque principale du fichier est "mp42". Il s'agit d'un identifiant qui identifie le format de conteneur ou l'encodeur utilisé.

  • minor_version: Indique le numéro de version mineure du fichier. Dans l'exemple, "0" signifie que le fichier a une version mineure de 0.

  • compatible_brands: Indique avec quels identifiants de marque compatibles le fichier est compatible. Dans l'exemple, "isomavc1mp42" signifie que le fichier est compatible avec les identifiants de marque "isom", "avc1" et "mp42".

  • creation_time: Indique l'heure de création du fichier. Dans l'exemple, "2010-01-10T08:29:06.000000Z" signifie que le fichier a été créé le 10 janvier 2010 08:29:06 UTC.

Ces informations de métadonnées fournissent des informations supplémentaires sur le fichier multimédia, telles que la marque du fichier, le numéro de version, la compatibilité et l'heure de création. Ces informations peuvent être utilisées pour déterminer les attributs de fichier, la compatibilité et les informations de production.

De quelles informations dispose Duration ?

Duration: 00:09:56.47, start: 0.000000, bitrate: 2119 kb/s

Cette information est relativement facile à comprendre. Le fichier vidéo dure 9 minutes et 56 secondes et le débit binaire de lecture est de 2119 kb/s.

Le débit binaire (bitrate) d'une vidéo fait référence au nombre de bits transmis ou traités par unité de temps, généralement en unités de bits par seconde (bps, bits par seconde). Il indique le taux de transfert ou la vitesse de traitement des données vidéo.

Le débit binaire affecte directement le volume de données et la qualité de la vidéo, un débit binaire plus élevé signifie que plus de données sont allouées à chaque unité de temps, offrant ainsi une meilleure qualité vidéo et des détails plus fins. Un débit binaire inférieur signifie que les données vidéo sont davantage compressées, ce qui peut réduire la taille du fichier ou réduire les besoins en bande passante de transmission, mais peut entraîner une perte de qualité vidéo et une perte de détails.

Quelles informations contient le flux audio ?

Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
    Metadata:
      creation_time   : 2010-01-10T08:29:06.000000Z
      handler_name    : (C) 2007 Google Inc. v08.13.2007.

"Stream #0:0(und)" indique les informations du premier flux (Stream). Vous trouverez ci-dessous une explication de chaque champ :

  • Audio: Indique que le flux est un flux audio.

  • aac (LC): Indique que le codec audio est le mode Low Complexity (Low Complexity) de AAC (Advanced Audio Coding).

  • mp4a / 0x6134706D: L'identifiant de l'encodeur audio est "mp4a", et la valeur hexadécimale correspondante est "0x6134706D".

  • 44100 Hz: Indique que le taux d'échantillonnage audio est de 44 100 Hz, c'est-à-dire le nombre d'échantillons audio collectés et lus par seconde.

  • stereo: Indique que le mode de canal audio est stéréo, c'est-à-dire les canaux gauche et droit.

  • fltp: Indique que le format d'échantillonnage audio est en virgule flottante.

  • 125 kb/s: Indique que le débit binaire audio est de 125 kb/s, c'est-à-dire que la quantité de données audio transmises ou traitées par seconde est de 125 kb.

  • (default): indique que le flux est le flux par défaut.

  • handler_name: Indique qu'il a été généré ou traité par une version du gestionnaire développé par Google Inc.

De quelles informations le flux vidéo dispose-t-il ?

"Stream #0:1(und)" indique les informations du deuxième flux (Stream), c'est-à-dire le flux vidéo. Vous trouverez ci-dessous une explication de chaque champ :

  • Video: Indique que le flux est un flux vidéo.

  • h264 (High): Indique que le codec vidéo est H.264 (Avancé).

  • avc1 / 0x31637661: L'identifiant de l'encodeur vidéo est "avc1", et la valeur hexadécimale correspondante est "0x31637661".

  • yuv420p: Indique que le format d'échantillonnage vidéo est YUV420P, c'est-à-dire que l'espace colorimétrique est YUV et que le rapport d'échantillonnage des composantes luma et chrominance est 4:2:0.

  • 1280x720: Indique que la résolution vidéo est de 1280x720 pixels.

  • [SAR 1:1 DAR 16:9]: Indique que le rapport d'aspect de l'échantillon (Sample Aspect Ratio) de la vidéo est de 1:1 et que le rapport d'aspect d'affichage (Display Aspect Ratio) est de 16:9.

  • 1991 kb/s: Indique que le débit binaire de la vidéo est de 1991 kb/s, c'est-à-dire que la quantité de données vidéo transmises ou traitées par seconde est de 1991 kb.

  • 24 fps: Indique que la fréquence d'images de la vidéo est de 24 images par seconde.

  • 24 tbr, 24k tbn, 48 tbc: Indique les informations de base de temps de la vidéo.

  • (default): indique que le flux est le flux par défaut.

  • handler_name: Indique qu'il a été généré ou traité par une version du gestionnaire développé par Google Inc.

Quels sont les éléments de la structure AVStream ?

La structure AVStream est une structure de données représentant le flux multimédia dans FFmpeg, qui contient divers attributs et informations du flux multimédia. Voici quelques variables membres couramment utilisées dans la structure AVStream :

  • index: Indique le numéro d'index du flux.

  • id: Indique l'identifiant unique du flux.

  • codecpar: un pointeur vers la structure AVCodecParameters, qui contient les paramètres de codec associés au flux.

  • time_base: Indique la base de temps du flux, qui est utilisée pour convertir les unités de temps en temps réel.

  • start_time: Indique l'heure de début du flux.

  • duration: Indique la durée du flux.

  • nb_frames: Indique le nombre d'images dans le flux.

  • disposition: Indique un indicateur dépendant de la mise en page ou de la position pour un flux.

  • avg_frame_rate: Indique la fréquence d'images moyenne du flux.

  • r_frame_rate: Indique la fréquence d'images de référence du flux.

  • metadata: un pointeur vers la structure AVDictionary, qui contient les métadonnées du flux.

streamsPour utiliser la structure AVStream, vous pouvez d'abord obtenir la structure AVStream spécifique via le tableau dans la structure AVFormatContext , puis utiliser les variables membres correspondantes pour obtenir les informations requises. Par exemple, pour obtenir le numéro d'index d'un flux, vous pouvez utiliser avStream->index, pour obtenir la base de temps d'un flux, vous pouvez utiliser avStream->time_baseet pour obtenir les métadonnées d'un flux, vous pouvez utiliser avStream->metadata.

Comment ffmpeg lit-il le flux vidéo ?

ffmpeg doit d'abord localiser le flux vidéo au format mp4, lire chaque image du flux vidéo et convertir chaque image au format yuv.

// 解码器
    AVCodec* codec = nullptr;
    AVCodecContext* codecContext = avcodec_alloc_context3(codec);

  // 寻找到视频流
    int videoStreamIndex = av_find_best_stream(inputContext, AVMEDIA_TYPE_VIDEO, -1, -1, &codec, 0);
    if (videoStreamIndex < 0) {
        // 没有找到视频流
        return -1;
    }

    // 获取视频流
    AVStream* stream = inputContext->streams[videoStreamIndex];
           
    if (avcodec_parameters_to_context(codecContext, stream->codecpar) < 0) {
        // 获取解码器上下文失败
        return -1;
    }
    if (avcodec_open2(codecContext, codec, nullptr) < 0) {
        // 打开解码器失败
        return -1;
    }

    // 分配视频帧和 YUV 帧
    AVFrame* frame = av_frame_alloc();
    AVFrame* frameYUV = av_frame_alloc();
    int frameBufferSize = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, codecContext->width, codecContext->height, 1);
    uint8_t* frameBuffer = (uint8_t*)av_malloc(frameBufferSize * sizeof(uint8_t));
    av_image_fill_arrays(frameYUV->data, frameYUV->linesize, frameBuffer, AV_PIX_FMT_YUV420P, codecContext->width, codecContext->height, 1);

    // 初始化图像转换上下文
    struct SwsContext* swsContext = sws_getContext(codecContext->width, codecContext->height, codecContext->pix_fmt, codecContext->width, codecContext->height, AV_PIX_FMT_YUV420P, SWS_BILINEAR, nullptr, nullptr, nullptr);
    // 读取视频帧并转换为 YUV 格式
    AVPacket packet;
    while (av_read_frame(inputContext, &packet) >= 0) {
        if (packet.stream_index == videoStreamIndex) {
            // 解码视频帧
            avcodec_send_packet(codecContext, &packet);
            avcodec_receive_frame(codecContext, frame);

            // 转换为 YUV 格式
            sws_scale(swsContext, frame->data, frame->linesize, 0, codecContext->height, frameYUV->data, frameYUV->linesize);

            // 在这里可以对 YUV 数据进行处理

            // 释放帧的引用
            av_frame_unref(frame);
        }

        av_packet_unref(&packet);
    }

Comment ffmpeg localise-t-il le deuxième d'un certain flux pour commencer à jouer ?

Utilisez la fonction av_seek_frame : Vous pouvez utiliser la fonction av_seek_frame pour localiser à un moment précis. Cette fonction peut être utilisée pour les flux audio et vidéo. Voici un exemple d'extrait de code montrant comment utiliser av_seek_frame pour effectuer une recherche jusqu'à un instant précis :

int64_t timestamp = desired_time * AV_TIME_BASE;  // 将秒转换为时间戳
int stream_index = 0;  // 假设我们要定位到第一个流

AVStream* stream = formatContext->streams[stream_index];
int64_t seek_target = av_rescale_q(timestamp, AV_TIME_BASE_Q, stream->time_base);

// 定位到指定时间点
av_seek_frame(formatContext, stream_index, seek_target, AVSEEK_FLAG_BACKWARD);

référence

Introduction de 5 minutes au format de fichier MP4

 

Je suppose que tu aimes

Origine blog.csdn.net/qq_42015552/article/details/131745978
conseillé
Classement