簡體   English   中英

FFMPEG I/O 自定義讀取功能

[英]Custom Reading Function for FFMPEG I/O

我需要創建一個自定義讀取回調函數,該函數可以將std::string形式的文件內容讀取到uint8_t * buf 我嘗試了在 Internet 和 stackoverflow 上找到的多種不同方法,但有時它可以工作,而其他程序無限循環或中途停止執行。

我對 amr/3gp 文件沒有任何問題,但所有 wav/pcm 文件由於某種原因導致了一些問題。 我只知道它與我目前擁有的閱讀功能有關。

理想情況下,我希望能夠為程序提供任何類型的文件,然后對其進行轉換。

這就是我從代碼中調用readCallback函數的方式:

//create the buffer
uint8_t * avio_ctx_buffer = NULL;

//allocate space for the buffer using ffmpeg allocation method
avio_ctx_buffer = (uint8_t *) av_malloc(avio_ctx_buffer_size);

//Allocate and initialize an AVIOContext for buffered I/O.
//audio variable contains the contents of the audio file
avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size,0, &audio, &readCallback, NULL, NULL);

這是適用於某些類型文件的回調函數:

static int readCallback(void* opaque, uint8_t * buf, int buf_size){  
  std::string * file =static_cast<std::string *>(opaque);
  if(file->length() == 0){
   return AVERROR_EOF; //if we reach to the end of the string, return
                       // return End of file
  }

  // Creating a vector of the string size
  std::vector<uint8_t> array(file->length());

  //Copying the contents of the string into the vector
  std::copy(file->begin(),file->end(),array.begin());

  //Copying the vector into buf
  std::copy(array.begin(),array.end(),buf);


  return file->length();

}

在嘗試了一段時間之后,我得到了一個使用 std::stringstream 的解決方案,它適用於我迄今為止測試過的幾種格式:3gp/amr、wav/pcm、mp3。

這是代碼片段:

//Create a string stream that contains the audio
std::stringstream audio_stream(audio);

//create the buffer
uint8_t * avio_ctx_buffer = NULL;

//allocate space for the buffer using ffmpeg allocation method
avio_ctx_buffer = (uint8_t *) av_malloc(avio_ctx_buffer_size);


//Allocate and initialize an AVIOContext for buffered I/O.
//Pass the stringstream audio_stream
avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size,0,&audio_stream, &readCallback, NULL, NULL);

回調函數:

static int readFunction1(void* opaque, uint8_t * buf, int buf_size){
   //Cast the opaque pointer to std::stringstream
   std::stringstream * me =static_cast<std::stringstream *>(opaque);

   //If we are at the end of the stream return FFmpeg's EOF
   if(me->tellg() == buf_size){
     return AVERROR_EOF;
   }
   // Read the stream into the buf and cast it to char *
   me->read((char*)buf, buf_size);

   //return how many characters extracted
   return me->tellg();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM