2013-05-01 79 views
1

我試圖實施的ffmpeg,將檢索本地視頻(從設備在未來)的緩衝區的自定義讀取功能,然後deocde該緩衝區等。FFMPEG自定義讀取功能讀取所有的數據

所以,這是我讀功能

int IORead(void *opaque, uint8_t *buf, int buf_size) 
{ 
FileReader* datrec = (FileReader*)opaque; 
int ret = datrec->Read(buf, buf_size); 
return ret; 
} 

至於的FileReader:

class FileReader { 
protected: 
    int fd; 
public: 
    FileReader(const char *filename){ //, int buf_size){ 
     fd = open(filename, O_RDONLY); 
     }; 

~FileReader() { 
     close(fd); 
    }; 

int Read(uint8_t *buf, int buf_size){ 
    int len = read(fd, buf, buf_size); 
    return len; 
     }; 
}; 

,爲我執行:

FileReader *receiver = new FileReader("/sdcard/clip.ts"); 

AVFormatContext *avFormatContextPtr = NULL; 
this->iobuffer = (unsigned char*) av_malloc(4096 + FF_INPUT_BUFFER_PADDING_SIZE); 
avFormatContextPtr = avformat_alloc_context(); 
avFormatContextPtr->pb = avio_alloc_context(this->iobuffer, 4096, 0, receiver, IORead, NULL, NULL); 
avFormatContextPtr->pb->seekable = 0; 

int err = avformat_open_input(&avFormatContextPtr, "", NULL, NULL) ; 
if(err != 0) 
{...} 
// Decoding process 
    {...} 

然而,一旦avformat_open_input()被調用時,讀取功能IORead被調用,並不斷讀取文件clip.ts直到它到達其最終才把它退出,並沒有數據到達解碼過程解碼(因爲所有的它被消耗)

我不知道是什麼特別,該代碼

AVFormatContext *avFormatContextPtr = NULL; 
int err = avformat_open_input(&avFormatContextPtr, "/sdcard/clip.ts", NULL, NULL) ; 

沒有阻止,直到該文件的末尾達到的問題。

我錯過了什麼嗎? 我感謝您的幫助。

回答

0

很可能,avformat無法確定您的流的類型。你應該使用類似於

avFormatContextPtr->iformat = av_find_input_format("mpegts");