FFMPEG自定义读取功能读取所有数据

时间:2013-05-01 16:33:41

标签: android c++ ffmpeg java-native-interface

我正在尝试为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) ;

未阻止,直到到达文件末尾。

我错过了什么吗? 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

最有可能的是,avformat无法确定您的流的类型。你应该使用像

这样的东西
avFormatContextPtr->iformat = av_find_input_format("mpegts");