這邊記錄一下筆記,因為太多公司內部的運作就無法貼code

  • 關於ffmpeg Streaming與 SDL

  • 從live555的 OpenRTSP 拿出 data buffer 丟到 ffmpeg 去decode

    • 這邊大概是我最不熟悉的部分,也是花最久時間的部分.一開始是拿openRTSP.c 來改

    • 由於我是接H264得source stream所以我拿 QuickTimeFileSink來用,選定MPEG4與MP4之後,其實檔案接下來都可以直接播放~這是沒有問題的.

    • 那如何要把資料接出來,方法如下:

      • 先到QuickTimeFileSink的 AfterGettingFrame 去implement 一個callback function

      • 其中最重要的是把buffer data 接出來

        • ioState->fBuffer->dataStart 這是frame buffer資料的起頭

        • packageDataSize 是frame buffer的大小

      • 由於資料是一個video frame 後面緊接著有數個audio frame,所以記得要先查看是哪一種格式好做相關的decode 準備

        • ioState->fOurSubsession.mediumName()
      • 至於接出來要怎麼decode 就要參考第一段的tutorial

      • 這裡要注意的是,由於拿到的frame data 是一張一張的,所以許多ffmpeg資料要填好 (SDL_AudioSpec)

  • 在ffmpeg中audio decoder無法順利地打開

    • 這個問題主要是在SDL_OpenAudio 可以正常開起,如果有把相關資料填對的話.但是卻無法開啟ffmpeg audio 的 avcodec_open2 

    • 原因是因為你需要把 audio Codec context 要填對,主要是:

      • adoContext->sample_rate

      • adoContext->channel

  • 在ffmpeg 接到的時候,video frame 無法順利decode

    • 這個狀況會很詭異的是,直接用ffmpeg 去接RTSP會成功,但是把一張張frame data接過來用ffmpeg去decode的話就會失敗.

    • 回去觀察原來的h264 frame data會發現,其實在video frame data buffer 起始的四個data 分別是

      • 0x00, 0x00, 0x00, 0x01
    • 所以如果把這四個位元加在video frame buffer的前面,就可以正常decode

 

先寫到這裡,其實還有許多更多的相關處理.之後整理一下心得在寫…. 

 

參考:


Evan

Attitude is everything