c++ - 在 C++ 中从 execve 调用时,ffmpeg 产生错误的输出

标签 c++ video ffmpeg fork execve

我正在编写一个涉及从 C++ 程序调用 ffmpeg 的 C++ 程序。几天前,我使用 std::system 让它工作

std::system("ffmpeg -threads auto -y -r 1.74659 -i /mnt/ev_ramdsk/1/%05d-capture.jpg -px_fmt yuv420p -preset ultrafast -r 10 /mnt/ev_ramdsk/1/video.mp4");

但这现在只工作了一次,它产生了 8MB 左右的 .mp4 视频,无法在任何地方播放..所以由于上一个问题中的建议,我转向了 execve。

这是我的代码

child_pid = fork();
        if(child_pid < 0){
            syslog(LOG_ERR, "ERROR: ffmpeg forking failed");
            return false;
        }
        else if(child_pid > 0){
            syslog(LOG_DEBUG, "DEBUG: forking succeeded, pid: %d", child_pid);
        }
        else if(child_pid == 0){
            char *newargv[16];
            for(int i=0; i < 15; i++) newargv[i] = (char *)malloc(sizeof(char) * 60); //allocate the array in memory
            strcpy(newargv[0], "/usr/bin/ffmpeg");
            strcpy(newargv[1], "-threads");
            strcpy(newargv[2], "auto");
            strcpy(newargv[3], "-y");
            strcpy(newargv[4], "-framerate");
            tempSS << fps;
            strcpy(newargv[5], tempSS.str().c_str());
            tempSS.str(std::string());
            strcpy(newargv[6], "-i");
            strcpy(newargv[7], std::string(conf->dir_ram + dest + "%05d-capture.jpg").c_str());
            strcpy(newargv[8], "-pix_fmt");
            strcpy(newargv[9], "yuv420p");
            strcpy(newargv[10], "-preset");
            strcpy(newargv[11], "ultrafast");
            strcpy(newargv[12], "-r");
            strcpy(newargv[13], "25");
            strcpy(newargv[14], std::string(conf->dir_ram + dest + "video.mp4").c_str());
            newargv[15] = NULL;

            for(int i=0; i < 15; i++){
                tempSS << "newargv[" << i << "] = \"" << newargv[i] << "\", ";
            }
            syslog(LOG_DEBUG, "DEBUG:newargv: %s", tempSS.str().c_str());
            tempSS.str(std::string());

            char *newenviron[] = { NULL };

            if(execve(newargv[0], newargv, newenviron) == -1){
                syslog(LOG_ERR, "ERROR: execve returned -1");
                exit(EXIT_SUCCESS);
            }
        }

        wpid = wait(&status);
        syslog(LOG_DEBUG, "DEBUG: ffmpeg child terminated, pid: %d, status: %d", wpid, status);

系统日志的输出是:

May 28 00:25:03 SERVER dt_ev_maker[10471]: DEBUG: forking succeeded, pid: 10658
May 28 00:25:03 SERVER dt_ev_maker[10658]: DEBUG:newargv: 
newargv[0] = "/usr/bin/ffmpeg", 
newargv[1] = "-threads", 
newargv[2] = "auto", 
newargv[3] = "-y", 
newargv[4] = "-framerate", 
newargv[5] = "1.45097", 
newargv[6] = "-i", 
newargv[7] = "/mnt/ev_ramdsk/1/%05d-capture.jpg", 
newargv[8] = "-pix_fmt", 
newargv[9] = "yuv420p", 
newargv[10] = "-preset", 
newargv[11] = "ultrafast", 
newargv[12] = "-r", 
newargv[13] = "25", 
newargv[14] = "/mnt/ev_ramdsk/1/video.mp4",
May 28 00:25:03 SERVER dt_ev_maker[10471]: DEBUG: ffmpeg child terminated, pid: 10658, status: 256

在这种情况下,视频的大小约为 90B,并且也已损坏。

注意:如果我从命令行运行相同的命令,视频可以正常播放。

我做错了什么?

提前致谢!

编辑

感谢 ouroborus(上面提交的更改)我可以制作 18MB 的视频,但我无法播放它们。

最佳答案

execve() 似乎需要它的数组才能有一个 NULL 的最后一个元素。将 newargv 数组扩展一个并将最后一个元素设置为 NULL,然后再将其传递给 execve()

引用:Using execve for the first time

关于c++ - 在 C++ 中从 execve 调用时,ffmpeg 产生错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494928/

相关文章:

ffmpeg 通过 rtp 流式传输 RAW TS

openCV - ffmpeg H264 和 Webm 错误

c++ - Qt 字符串解析

c++ - 使小部件在 Qt 布局中部分重叠

c++ - 获取cocos2dx游戏时间

c++ - Windows 10 上的 CppFlow

php - 从 curl 或 get_video_info 抓取 youtube 视频 URL

javascript - 如何在jw播放器中调用kaltura视频

video - 如何给mp4视频加水印?

php - Laravel FFMPEG 中的条件格式