C++ Boost启动FFMPEG不工作,通过终端正常工作

bxfogqkk  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(135)

我从C++启动一个FFMPEG进程,该命令从终端命令行工作正常,但从代码启动时出错。什么会导致这种情况?

错误

[AVFilterGraph @ 0x3cfadc0] Error parsing filterchain "[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]"
    
[AVFilterGraph @ 0x2f9fb00] Error parsing filterchain 
    
[AVFilterGraph @ 0x3cfadc0] Trailing garbage after a filter: split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]

编码

std::vector<std::string> args;
args.push_back("-i"); args.push_back("input.mp4");
args.push_back("-filter_complex");
args.push_back("\"[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]\"");

args.push_back("-map");  args.push_back("[v1out]");
args.push_back("-c:v:0");  args.push_back("libx264");
args.push_back("-x264-params");  args.push_back("\"nal-hrd=cbr:force-cfr=1\"");
args.push_back("-b:v:0");  args.push_back("1M");
args.push_back("-maxrate:v:0");  args.push_back("2M");
args.push_back("-minrate:v:0");  args.push_back("2M");
args.push_back("-bufsize:v:0");  args.push_back("2M");
args.push_back("-preset");  args.push_back("fast");
args.push_back("-g");  args.push_back("48");
args.push_back("-sc_threshold");  args.push_back("0");
args.push_back("-keyint_min");  args.push_back("48");

args.push_back("-map");  args.push_back("[v2out]");
args.push_back("-c:v:1");  args.push_back("libx264");
args.push_back("-x264-params");  args.push_back("\"nal-hrd=cbr:force-cfr=1\"");
args.push_back("-b:v:1");  args.push_back("1M");
args.push_back("-maxrate:v:1");  args.push_back("1M");
args.push_back("-minrate:v:1");  args.push_back("1M");
args.push_back("-bufsize:v:1");  args.push_back("1M");
args.push_back("-preset");  args.push_back("fast");
args.push_back("-g");  args.push_back("48");
args.push_back("-sc_threshold");  args.push_back("0");
args.push_back("-keyint_min");  args.push_back("48");

args.push_back("-map");  args.push_back("[v3out]");
args.push_back("-c:v:2");  args.push_back("libx264");
args.push_back("-x264-params");  args.push_back("\"nal-hrd=cbr:force-cfr=1\"");
args.push_back("-b:v:2");  args.push_back("500K");
args.push_back("-maxrate:v:2");  args.push_back("500K");
args.push_back("-minrate:v:2");  args.push_back("500K");
args.push_back("-bufsize:v:2");  args.push_back("500K");
args.push_back("-preset");  args.push_back("fast");
args.push_back("-g");  args.push_back("48");
args.push_back("-sc_threshold");  args.push_back("0");
args.push_back("-keyint_min");  args.push_back("48");

args.push_back("-map");  args.push_back("a:0");
args.push_back("-c:a:0");  args.push_back("aac");
args.push_back("-b:a:0");  args.push_back("96k");
args.push_back("-ac");  args.push_back("2");
args.push_back("-map");  args.push_back("a:0");
args.push_back("-c:a:1");  args.push_back("aac");
args.push_back("-b:a:1");  args.push_back("96k");
args.push_back("-ac");  args.push_back("2");
args.push_back("-map");  args.push_back("a:0");
args.push_back("-c:a:2");  args.push_back("aac");
args.push_back("-b:a:2");  args.push_back("48k");
args.push_back("-ac");  args.push_back("2");

args.push_back("-avoid_negative_ts");  args.push_back("1");
args.push_back("-f");  args.push_back("hls");
args.push_back("-hls_time");  args.push_back("6");
args.push_back("-hls_list_size");  args.push_back("15");
args.push_back("-hls_flags");  args.push_back("independent_segments");
args.push_back("-hls_segment_type");  args.push_back("mpegts");
args.push_back("-hls_segment_filename");  args.push_back("/output/stream_%v_data%02d.ts");
args.push_back("-master_pl_name");  args.push_back("index.m3u8");
args.push_back("-var_stream_map");  args.push_back("\"v:0,a:0 v:1,a:1 v:2,a:2\"");
args.push_back("/output/stream_%v.m3u8");

m_childProcess = std::make_unique<bp::child>(
            bp::exe = ffmpegPath,
            bp::args = args);

上面代码构建的命令(缩进可见):

ffmpeg -i input.mp4 -c copy -filter_complex "[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]" 
-map [v1out] -c:v:0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:0 1M -maxrate:v:0 2M -minrate:v:0 2M -bufsize:v:0 2M -preset fast -g 48 -sc_threshold 0 -keyint_min 48 
-map [v2out] -c:v:1 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:1 1M -maxrate:v:1 1M -minrate:v:1 1M -bufsize:v:1 1M -preset fast -g 48 -sc_threshold 0 -keyint_min 48  
-map [v3out] -c:v:2 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:2 500K -maxrate:v:2 500K -minrate:v:2 500K -bufsize:v:2 500K -preset fast -g 48 -sc_threshold 0 -keyint_min 48 -map a:0 -c:a:0 aac -b:a:0 96k -ac 2 
-map a:0 -c:a:1 aac -b:a:1 96k -ac 2 -map a:0 -c:a:2 aac -b:a:2 48k -ac 2 
-avoid_negative_ts 1 -f hls -hls_time 6 -hls_list_size 15 -hls_flags independent_segments -hls_segment_type mpegts -hls_segment_filename /output/stream_%v_data%02d.ts -master_pl_name index.m3u8 -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" /output/stream_%v.m3u8
mfuanj7w

mfuanj7w1#

你包含了shell引号,但你没有使用shell,修复这些:

std::vector<std::string> args;
args.push_back("-i"); args.push_back("input.mp4");
args.push_back("-filter_complex");
args.push_back("[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]");

args.push_back("-map");                   args.push_back("[v1out]");
args.push_back("-c:v:0");                 args.push_back("libx264");
args.push_back("-x264-params");           args.push_back("nal-hrd=cbr:force-cfr=1");
args.push_back("-b:v:0");                 args.push_back("1M");
args.push_back("-maxrate:v:0");           args.push_back("2M");
args.push_back("-minrate:v:0");           args.push_back("2M");
args.push_back("-bufsize:v:0");           args.push_back("2M");
args.push_back("-preset");                args.push_back("fast");
args.push_back("-g");                     args.push_back("48");
args.push_back("-sc_threshold");          args.push_back("0");
args.push_back("-keyint_min");            args.push_back("48");

args.push_back("-map");                   args.push_back("[v2out]");
args.push_back("-c:v:1");                 args.push_back("libx264");
args.push_back("-x264-params");           args.push_back("nal-hrd=cbr:force-cfr=1");
args.push_back("-b:v:1");                 args.push_back("1M");
args.push_back("-maxrate:v:1");           args.push_back("1M");
args.push_back("-minrate:v:1");           args.push_back("1M");
args.push_back("-bufsize:v:1");           args.push_back("1M");
args.push_back("-preset");                args.push_back("fast");
args.push_back("-g");                     args.push_back("48");
args.push_back("-sc_threshold");          args.push_back("0");
args.push_back("-keyint_min");            args.push_back("48");

args.push_back("-map");                   args.push_back("[v3out]");
args.push_back("-c:v:2");                 args.push_back("libx264");
args.push_back("-x264-params");           args.push_back("nal-hrd=cbr:force-cfr=1");
args.push_back("-b:v:2");                 args.push_back("500K");
args.push_back("-maxrate:v:2");           args.push_back("500K");
args.push_back("-minrate:v:2");           args.push_back("500K");
args.push_back("-bufsize:v:2");           args.push_back("500K");
args.push_back("-preset");                args.push_back("fast");
args.push_back("-g");                     args.push_back("48");
args.push_back("-sc_threshold");          args.push_back("0");
args.push_back("-keyint_min");            args.push_back("48");

args.push_back("-map");                   args.push_back("a:0");
args.push_back("-c:a:0");                 args.push_back("aac");
args.push_back("-b:a:0");                 args.push_back("96k");
args.push_back("-ac");                    args.push_back("2");
args.push_back("-map");                   args.push_back("a:0");
args.push_back("-c:a:1");                 args.push_back("aac");
args.push_back("-b:a:1");                 args.push_back("96k");
args.push_back("-ac");                    args.push_back("2");
args.push_back("-map");                   args.push_back("a:0");
args.push_back("-c:a:2");                 args.push_back("aac");
args.push_back("-b:a:2");                 args.push_back("48k");
args.push_back("-ac");                    args.push_back("2");

args.push_back("-avoid_negative_ts");     args.push_back("1");
args.push_back("-f");                     args.push_back("hls");
args.push_back("-hls_time");              args.push_back("6");
args.push_back("-hls_list_size");         args.push_back("15");
args.push_back("-hls_flags");             args.push_back("independent_segments");
args.push_back("-hls_segment_type");      args.push_back("mpegts");
args.push_back("-hls_segment_filename");  args.push_back("/output/stream_%v_data%02d.ts");
args.push_back("-master_pl_name");        args.push_back("index.m3u8");
args.push_back("-var_stream_map");        args.push_back("v:0,a:0 v:1,a:1 v:2,a:2");
args.push_back("/output/stream_%v.m3u8");

我也会考虑换个说法

std::vector<std::string> args{
    "-i", "input.mp4",       //
    "-filter_complex", //
    "[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]", //

    "-map",          "[v1out]",
    "-c:v:0",        "libx264",
    "-x264-params",  "nal-hrd=cbr:force-cfr=1",
    "-b:v:0",        "1M",
    "-maxrate:v:0",  "2M",
    "-minrate:v:0",  "2M",
    "-bufsize:v:0",  "2M",
    "-preset",       "fast",
    "-g",            "48",
    "-sc_threshold", "0",
    "-keyint_min",   "48",

    "-map",          "[v2out]",
    "-c:v:1",        "libx264",
    "-x264-params",  "nal-hrd=cbr:force-cfr=1",
    "-b:v:1",        "1M",
    "-maxrate:v:1",  "1M",
    "-minrate:v:1",  "1M",
    "-bufsize:v:1",  "1M",
    "-preset",       "fast",
    "-g",            "48",
    "-sc_threshold", "0",
    "-keyint_min",   "48",

    "-map",          "[v3out]",
    "-c:v:2",        "libx264",
    "-x264-params",  "nal-hrd=cbr:force-cfr=1",
    "-b:v:2",        "500K",
    "-maxrate:v:2",  "500K",
    "-minrate:v:2",  "500K",
    "-bufsize:v:2",  "500K",
    "-preset",       "fast",
    "-g",            "48",
    "-sc_threshold", "0",
    "-keyint_min",   "48",

    "-map",   "a:0",
    "-c:a:0", "aac",
    "-b:a:0", "96k",
    "-ac",    "2",
    "-map",   "a:0",
    "-c:a:1", "aac",
    "-b:a:1", "96k",
    "-ac",    "2",
    "-map",   "a:0",
    "-c:a:2", "aac",
    "-b:a:2", "48k",
    "-ac",    "2",

    "-avoid_negative_ts",    "1",
    "-f",                    "hls",
    "-hls_time",             "6",
    "-hls_list_size",        "15",
    "-hls_flags",            "independent_segments",
    "-hls_segment_type",     "mpegts",
    "-hls_segment_filename", "/output/stream_%v_data%02d.ts",
    "-master_pl_name",       "index.m3u8",
    "-var_stream_map",       "v:0,a:0 v:1,a:1 v:2,a:2",
    "/output/stream_%v.m3u8"
};

相关问题