[FFmpeg-Kampf] Kurze Analyse des ffplay.c-Prozesses

Ursprünglicher Link: https://blog.csdn.net/biezhihua/article/details/90730061

FFplay.c

Bild

hauptsächlich()

Hauptfunktion

avformat_network_init()

Netzwerkbibliothek initialisieren()Dies ist optional und wird nicht mehr empfohlen.

http://ffmpeg.org/doxygen/trunk/group__lavf__core.html#ga84542023693d61e8564c5d457979c932

show_banner()

Drucken Sie FFmpeg-Versionsinformationen aus (Kompilierungszeit, Kompilierungsoptionen, Informationen zur Klassenbibliothek usw.).

parse_options() Befehlszeilen-Eingabeoptionen analysieren

  1. parse_option()Parameter analysieren
  2. find_option()_Finden Sie das entsprechende entsprechend den ParameternOptionDef
  3. write_option()_implementierenOptionDef

SDL_Init()SDL initialisieren. Video und Audio in FFPlay verwenden alle SDL.

SDL_CreateWindow()SDL-Fenster erstellen

https://wiki.libsdl.org/SDL_CreateWindow

SDL_CreateRedner()Erstellen Sie einen SDL-Rendering-Kontext für das SDL-Fenster

https://wiki.libsdl.org/SDL_CreateRenderer

https://wiki.libsdl.org/SDL_RendererFlags

stream_open()

Eingabemedien öffnen

frame_queue_init()Initialisieren Sie die Frame-Warteschlange, FrameQueuedie intern ein begrenztes Array ist und max_size_die Standard-Cache-Daten basierend auf den internen initialisiert

f->queue[i].frame = av_frame_alloc()

frame_queue_destory()Zerstören Sie die Frame-Warteschlange und geben Sie die zwischengespeicherten Daten während der Initialisierung freiav_frame_free()

packet_queue_init()Initialisieren Sie die Paketwarteschlange, PacketQueuebei der es sich um eine benutzerdefinierte verknüpfte Liste handelt

init_clock()Initialisieren Sie die Uhr und verwenden Sie den Standardwert ( NAN/-1), um die Uhr pst/last_update/pst_dirft/serial_und andere Daten zu initialisieren.

  1. av_gettime_relative()Ruft die Zeit (in Nanosekunden) seit einem nicht angegebenen Zeitpunkt ab. Dateireferenz time.c
  2. set_clock_at(c,pts,serial,time)

read_thread()

Frame-Lesethread

avformat_alloc_context()Kontext initialisieren

FFmpeg: Kernfunktionen

http://ffmpeg.org/doxygen/trunk/group__lavf__core.html#gac7a91abf2f59648d995894711f070f62

avformat_open_input()Öffnen Sie den Dateistream und lesen Sie die Dateiheaderdaten

avformat_find_stream_info()Erhalten Sie Informationen zum Medienstream

avformat_seek_file()

av_dump_format()Geben Sie Medieninformationen an die Konsole aus

av_find_best_stream()Holen Sie sich den am besten geeigneten Stream

av_guess_sample_aspect_ratio()Stream-Abtastrate abrufen

AVCodecParametersCodec-Parameter

set_default_window_size()Fenstergröße einstellen

  1. calculate_display_rect()Berechnen Sie den anzeigbaren Bereich basierend auf der Bildschirmbreite und -höhe sowie der Stream-Pixelbreite und -höhe

stream_component_open()Öffnen Sie jeweils Video-/Audio-/Untertitel-Dekodierungsthreads

av_read_pause()/av_read_play()Halten Sie einen Netzwerk-Stream an oder spielen Sie ihn ab

FFmpeg: Demuxen

avformat_seek_file()Schneller Vorlauf

FFmpeg: Demuxen

packet_queue_flush()Leeren Sie den Cache der Paketwarteschlange

stream_has_enough_packets()Ist genügend Paketcache vorhanden?

av_read_frame()Lesen Sie einen Frame mit Rohdaten aus dem Stream

packet_queue_put()Fügen Sie die gelesenen Paketdaten zur Warteschlange hinzu

stream_component_open()

Öffnen Sie jeweils Video-/Audio-/Untertitel-Dekodierungsthreads

avcodec_alloc_context3()Codec-Kontext erstellen

avcodec_parameters_to_context()Kopieren Sie Parameter vom Stream in den Codec-Kontext

avcodec_find_decoder()Rufen Sie den Codec basierend auf der Codierungs-ID ab

avcodec_find_decoder_by_name()Finden Sie Codecs nach Namen

avcodec_open2()Initialisieren Sie den Codec-Kontext basierend auf dem Codec

audio_open()Aktivieren Sie die Audiodekodierung

  1. av_get_default_channel_layout(wanted_nb_channels)
  2. av_get_channel_layout_nb_channels(wanted_channel_layout)
  3. sdl_audio_callback()
  4. audio_decode_frame()
  5. synchronize_audio()
  6. swr_convert()
  7. SDL_OpenAudioDevice()https://wiki.libsdl.org/SDL_OpenAudioDevice

audio_thread()Audio-Frames dekodieren

  1. decoder_decode_frame()
  2. avcodec_send_packet()
  3. avcodec_receive_frame()

video_thread()Videobilder dekodieren

  1. get_video_frame()Holen Sie sich Videobilder
  2. decoder_decode_frame()
  3. av_guess_sample_aspect_ratio()
  4. queue_picture()Videobilddaten in die Warteschlange stellen
  5. frame_queue_peek_writable()Warten auf verfügbare Daten vom Framebuffer
  6. av_frame_move_ref()Überweisungsreferenz
  7. frame_queue_push()Erhöhen Sie die Größe der Frame-Warteschlange

subtitle_thread()__Untertitelrahmen dekodieren

  1. frame_queue_peek_writable()
  2. decoder_decode_frame()
  3. frame_queue_push()

event_loop()

Behandeln Sie Tastaturereignisse und Videoaktualisierungen

video_refresh()Handhabung der Videoaktualisierung und -anzeige

  1. frame_queue_peek_last()Bild aus der Warteschlange entfernen
  2. frame_queue_peek()
  3. video_display()Bild anzeigen
    1. video_open()Fenster öffnen
    2. video_image_display()Bildschirm
      1. frame_queue_peek_last()
      2. calculate_display_rect()Berechnen Sie die Position des Bildschirms. Wenn das SDL-Fenster gestreckt ist, kann das Seitenverhältnis des Videos beibehalten werden
      3. upload_texture()
      4. SDL_RenderCopyEx()
  >>> 音视频开发 视频教程: https://ke.qq.com/course/3202131?flowToken=1031864 
  >>> 音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群 739729163 领取

Supongo que te gusta

Origin blog.csdn.net/weixin_52622200/article/details/131558223
Recomendado
Clasificación