有没有办法让ffmpeg从多个缓冲区或多个命名管道中读取?
基本上我想将第一个循环输出到不同的管道而不是.jpg文件,并使用这些管道作为输入运行视频过滤器命令。现在需要巨大的磁盘IO来创建和读取jpg磁贴。
// heic -> tiles -> jpeg tiles
#pragma omp parallel for
for(uint i = 0; i < data.tiles.size(); ++i) {
char buff[100];
snprintf(buff, sizeof(buff), "./tmp/%03d.jpg", data.tiles[i].idx);
std::string cmdStr = "ffmpeg -i - -loglevel warning -frames:v 1 -vsync vfr -an -q:v 1 " + std::string(buff);
FILE * pipe_in;
if(pipe_in = popen(cmdStr.c_str(), "w")) {
fwrite((char*)&data.tiles[i].data[0], 1, data.tiles[i].data.size(), pipe_in);
fflush(pipe_in);
fclose(pipe_in);
}
}
... some processing
// jpeg tiles -> big jpeg
std::string inputStr = "./tmp/%03d.jpg";
std::string cmdStr = "ffmpeg -i " + inputStr +
" -loglevel warning -threads 4 -q:v 1 -vf \"tile=" + std::to_string(data.cols) + "x" + std::to_string(data.rows) +
",crop=" + std::to_string(data.width) + ":" + std::to_string(data.height) + ":0:0" +
transStr + "\" -y " + outputStr;
ret = std::system(cmdStr.c_str());