Ursprünglicher Link: https://blog.csdn.net/biezhihua/article/details/90730061
FFplay.c
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
parse_option()
Parameter analysierenfind_option()_
Finden Sie das entsprechende entsprechend den ParameternOptionDef
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, FrameQueue
die 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, PacketQueue
bei 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.
av_gettime_relative()
Ruft die Zeit (in Nanosekunden) seit einem nicht angegebenen Zeitpunkt ab. Dateireferenz time.cset_clock_at(c,pts,serial,time)
read_thread()
Frame-Lesethread
avformat_alloc_context()
Kontext initialisieren
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
AVCodecParameters
Codec-Parameter
set_default_window_size()
Fenstergröße einstellen
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
avformat_seek_file()
Schneller Vorlauf
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
av_get_default_channel_layout(wanted_nb_channels)
av_get_channel_layout_nb_channels(wanted_channel_layout)
sdl_audio_callback()
audio_decode_frame()
synchronize_audio()
swr_convert()
SDL_OpenAudioDevice()
https://wiki.libsdl.org/SDL_OpenAudioDevice
audio_thread()
Audio-Frames dekodieren
decoder_decode_frame()
avcodec_send_packet()
avcodec_receive_frame()
video_thread()
Videobilder dekodieren
get_video_frame()
Holen Sie sich Videobilderdecoder_decode_frame()
av_guess_sample_aspect_ratio()
queue_picture()
Videobilddaten in die Warteschlange stellenframe_queue_peek_writable()
Warten auf verfügbare Daten vom Framebufferav_frame_move_ref()
Überweisungsreferenzframe_queue_push()
Erhöhen Sie die Größe der Frame-Warteschlange
subtitle_thread()_
_Untertitelrahmen dekodieren
frame_queue_peek_writable()
decoder_decode_frame()
frame_queue_push()
event_loop()
Behandeln Sie Tastaturereignisse und Videoaktualisierungen
video_refresh()
Handhabung der Videoaktualisierung und -anzeige
frame_queue_peek_last()
Bild aus der Warteschlange entfernenframe_queue_peek()
video_display()
Bild anzeigenvideo_open()
Fenster öffnenvideo_image_display()
Bildschirmframe_queue_peek_last()
calculate_display_rect()
Berechnen Sie die Position des Bildschirms. Wenn das SDL-Fenster gestreckt ist, kann das Seitenverhältnis des Videos beibehalten werdenupload_texture()
SDL_RenderCopyEx()
>>> 音视频开发 视频教程: https://ke.qq.com/course/3202131?flowToken=1031864
>>> 音视频开发学习资料、教学视频,免费分享有需要的可以自行添加学习交流群 739729163 领取