[FFMPEG-程式碼分析]ffmpeg.c
阿新 • • 發佈:2019-01-09
1.前沿
接觸ffmpeg2年多,系統使用大概半年左右。ffmpeg命令列方式作為“本地檔案”處理足夠,但要更加精準的控制還是需要借用SDK的方式,好在ffmpeg的example中提供了大量的簡單例子。好了廢話不多說,開始幹活。
ffmpeg版本3.2
2.主體結構分析
簡單記錄講解比較重要的函式
main:主函式入口
|--*_register_all:註冊各種模組(ffmpeg驅動模組化思維的最佳體現);
|--avformat_network_init:初始化網路環境
|--ffmpeg_parse_options:<1>解析並設定命令列的輸入引數;<2 >開啟輸入輸出“檔案”;<3>初始化complex filters;
|--transcode:轉碼/流重封裝入口
|--transcode_init:初始化輸入輸出的codec;
|--init_input_stream
|--avcodec_open2:開啟解碼器
|--init_output_stream
|--1.0.編碼
|--1.1.init_output_stream_encode:設定編碼引數的函式,該函式具有很強的參考意義
|--1.2.avcodec_open2:開啟編碼器
|--1.3.avcodec_parameters_from_context
|--1.4.avcodec_copy_context
|--2.0.重封裝
|--2.1.init_output_stream_streamcopy:重封裝函式
|--2.2.avcodec_parameters_to_context
|--init_output_bsfs:初始化bsfs(bsfs相關函式介面有新的變化,可以參考更新
|--transcode_step
|--configure_filtergraph:初始化simple filters,包括構建graph
|--transcode_from_filter:
|--avfilter_graph_request_oldest
|--reap_filters(0)
|--av_buffersink_get_frame_flags (AV_BUFFERSINK_FLAG_NO_REQUEST)
|--do_video_out
|--process_input:轉碼重要步驟
|--get_input_packet:獲取解碼幀資料
|--av_read_frame:讀取一幀資料
|--process_input_packet
|--decode_video
|--decode:(avcodec_send_packet/avcodec_receive_frame):解碼關鍵函式,新的介面
|--av_frame_get_best_effort_timestamp
|--send_frame_to_filters:將解碼幀送往graph入口
|--ifilter_send_frame
|--reap_filters(1)
|--av_buffersrc_add_frame_flags (AV_BUFFERSRC_FLAG_PUSH)
|--reap_filters(0):獲取幀並封裝輸出
HAVE_PTHREADS:將為對讀輸入流單獨建立執行緒,讀取的幀資料放入佇列;當解碼需要資料時,再從佇列中取出資料;
3.reap_filters分析
reap_filters
|--av_buffersink_get_frame_flags (AV_BUFFERSINK_FLAG_NO_REQUEST):從graph輸出口獲取filter資料
|--do_video_out
|--編碼:(avcodec_send_frame/avcodec_receive_packet) :編碼幀
|--av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
|--output_packet
|--bitstream filters:(av_bsf_send_packet/av_bsf_receive_packet):bsfs處理
|--write_packet:封裝傳送
|--av_packet_rescale_ts(pkt, ost->mux_timebase, ost->st->time_base);
|--av_interleaved_write_frame(s, pkt);
4.關於ffmpeg例子的一些坑
1.編碼後的fps和tbc,總是源的兩倍?
2.輸出為mpegts時,且設定muxrate,阻塞?
3.當流出現丟包時,會卡住?
4.多執行緒使用,出現段錯誤?
5.當不使用muxrate時,pat/pmt/pcr間隔嚴重失準?
6.如何偏移pts和dts?