← index
img2mov/img2mov-gui/ffmpeg_write.cpp
Source: img2mov/img2mov-gui/ffmpeg_write.cpp
#include "ffmpeg_write.h"
#include<sstream>
#include<fstream>
#ifndef _WIN32
#include<unistd.h>
#endif
// ffmpeg -y -s 640x480  -pixel_format bgr24 -f rawvideo -r 30 -i pipe: -vcodec libx265 -pix_fmt yuv420p -crf 24 test.mp4
#ifdef __APPLE__
std::string ffmpeg_path = "ffmpeg";
#else
std::string ffmpeg_path = "ffmpeg";
#endif

char buffer[1024*1024];
std::fstream file;
int stdout_save;

FILE *open_ffmpeg(const char *output, const char *codec, const char *, const char *dst_res, const char *fps, const char *crf) {
    
    std::string tag;
    if(std::string(codec)=="libx265")
        tag = "-tag:v hvc1";
    
    std::ostringstream stream;
    stream << ffmpeg_path << " -y -s " << dst_res << " -pixel_format bgr24 -f rawvideo -r " << fps << " -i pipe: -vcodec " << codec << " -pix_fmt yuv420p " <<  tag << " -crf " << crf << " " <<  output;
    
#ifndef _WIN32
    FILE *fptr = popen(stream.str().c_str(), "w");
#else
    FILE *fptr = _popen(stream.str().c_str(), "wb");
#endif
    if(!fptr) {
        std::cerr << "Error: could not open ffmpeg\n";
        return 0;
    }
    return fptr;
}

//ffmpeg -f avfoundation -i ":iShowU Audio Capture" -acodec libmp3lame -ab 128k -f mp3 -

void list_devices() {
#ifdef __APPLE__
    std::string s = ffmpeg_path + " -list_devices true -f avfoundation -i dummy";
    FILE *fptr = popen(s.c_str(), "r");
    if(!fptr) {
        std::cout << "img2mov: Error: could not read file...\n";
        exit(0);
    }
    while(!feof(fptr)) {
        char buf[1024];
        if(fgets(buf, 1024, fptr) != NULL)
            std::cout << buf;
    }
    pclose(fptr);
#endif
}

void write_ffmpeg(FILE *fptr, cv::Mat &frame) {
    fwrite(frame.ptr(), sizeof(char), frame.total()*frame.elemSize(), fptr);
}

void close_stdout() {
    
}

void mux_audio(const char *output, const char *src, const char *final_file) {
    std::ostringstream stream;
    stream << ffmpeg_path << " -y -i \"" << output << "\" -i \"" << src << "\" -c copy -map 0:v:0 -map 1:a:0? -shortest \"" << final_file << "\"";
    std::cout << "img2mov: " << stream.str() << "\n";
#ifndef _WIN32
    FILE *fptr = popen(stream.str().c_str(), "r");
#else
    FILE *fptr = _popen(stream.str().c_str(), "r");
#endif
    if(!fptr) {
        std::cerr << "Error: could not open ffmpeg\n";
        return;
    }
    while(!feof(fptr)) {
        char buf[256];
        if(fgets(buf, 256, fptr) != NULL)
            std::cout << buf;
   }
#ifndef _WIN32
    pclose(fptr);
#else
    _pclose(fptr);
#endif
}

void rotate_90(const char *output, const char *src) {
    std::ostringstream stream;
    stream << ffmpeg_path << " -i \"" << output << "\" -c copy  -metadata:s:v:0 rotate=90 " << "\"" << src << "\"";
    std::cout << "img2mov: " << stream.str() << "\n";
#ifndef _WIN32
    FILE *fptr = popen(stream.str().c_str(), "r");
#else
    FILE *fptr = _popen(stream.str().c_str(), "r");
#endif
    if(!fptr) {
        std::cerr << "Error: could not open ffmpeg\n";
        return;
    }
    while(!feof(fptr)) {
        char buf[256];
        if(fgets(buf, 256, fptr) != NULL)
        std::cout << buf;
    }
#ifndef _WIN32
    pclose(fptr);
#else
    _pclose(fptr);
#endif
    
}