1. 程式人生 > >[FFMPEG-程式碼分析]ffmpeg.c

[FFMPEG-程式碼分析]ffmpeg.c

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?