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

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

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

错误

  1. [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]"
  2. [AVFilterGraph @ 0x2f9fb00] Error parsing filterchain
  3. [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]

编码

  1. std::vector<std::string> args;
  2. args.push_back("-i"); args.push_back("input.mp4");
  3. args.push_back("-filter_complex");
  4. 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]\"");
  5. args.push_back("-map"); args.push_back("[v1out]");
  6. args.push_back("-c:v:0"); args.push_back("libx264");
  7. args.push_back("-x264-params"); args.push_back("\"nal-hrd=cbr:force-cfr=1\"");
  8. args.push_back("-b:v:0"); args.push_back("1M");
  9. args.push_back("-maxrate:v:0"); args.push_back("2M");
  10. args.push_back("-minrate:v:0"); args.push_back("2M");
  11. args.push_back("-bufsize:v:0"); args.push_back("2M");
  12. args.push_back("-preset"); args.push_back("fast");
  13. args.push_back("-g"); args.push_back("48");
  14. args.push_back("-sc_threshold"); args.push_back("0");
  15. args.push_back("-keyint_min"); args.push_back("48");
  16. args.push_back("-map"); args.push_back("[v2out]");
  17. args.push_back("-c:v:1"); args.push_back("libx264");
  18. args.push_back("-x264-params"); args.push_back("\"nal-hrd=cbr:force-cfr=1\"");
  19. args.push_back("-b:v:1"); args.push_back("1M");
  20. args.push_back("-maxrate:v:1"); args.push_back("1M");
  21. args.push_back("-minrate:v:1"); args.push_back("1M");
  22. args.push_back("-bufsize:v:1"); args.push_back("1M");
  23. args.push_back("-preset"); args.push_back("fast");
  24. args.push_back("-g"); args.push_back("48");
  25. args.push_back("-sc_threshold"); args.push_back("0");
  26. args.push_back("-keyint_min"); args.push_back("48");
  27. args.push_back("-map"); args.push_back("[v3out]");
  28. args.push_back("-c:v:2"); args.push_back("libx264");
  29. args.push_back("-x264-params"); args.push_back("\"nal-hrd=cbr:force-cfr=1\"");
  30. args.push_back("-b:v:2"); args.push_back("500K");
  31. args.push_back("-maxrate:v:2"); args.push_back("500K");
  32. args.push_back("-minrate:v:2"); args.push_back("500K");
  33. args.push_back("-bufsize:v:2"); args.push_back("500K");
  34. args.push_back("-preset"); args.push_back("fast");
  35. args.push_back("-g"); args.push_back("48");
  36. args.push_back("-sc_threshold"); args.push_back("0");
  37. args.push_back("-keyint_min"); args.push_back("48");
  38. args.push_back("-map"); args.push_back("a:0");
  39. args.push_back("-c:a:0"); args.push_back("aac");
  40. args.push_back("-b:a:0"); args.push_back("96k");
  41. args.push_back("-ac"); args.push_back("2");
  42. args.push_back("-map"); args.push_back("a:0");
  43. args.push_back("-c:a:1"); args.push_back("aac");
  44. args.push_back("-b:a:1"); args.push_back("96k");
  45. args.push_back("-ac"); args.push_back("2");
  46. args.push_back("-map"); args.push_back("a:0");
  47. args.push_back("-c:a:2"); args.push_back("aac");
  48. args.push_back("-b:a:2"); args.push_back("48k");
  49. args.push_back("-ac"); args.push_back("2");
  50. args.push_back("-avoid_negative_ts"); args.push_back("1");
  51. args.push_back("-f"); args.push_back("hls");
  52. args.push_back("-hls_time"); args.push_back("6");
  53. args.push_back("-hls_list_size"); args.push_back("15");
  54. args.push_back("-hls_flags"); args.push_back("independent_segments");
  55. args.push_back("-hls_segment_type"); args.push_back("mpegts");
  56. args.push_back("-hls_segment_filename"); args.push_back("/output/stream_%v_data%02d.ts");
  57. args.push_back("-master_pl_name"); args.push_back("index.m3u8");
  58. args.push_back("-var_stream_map"); args.push_back("\"v:0,a:0 v:1,a:1 v:2,a:2\"");
  59. args.push_back("/output/stream_%v.m3u8");
  60. m_childProcess = std::make_unique<bp::child>(
  61. bp::exe = ffmpegPath,
  62. bp::args = args);

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

  1. 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]"
  2. -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
  3. -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
  4. -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
  5. -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
  6. -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,修复这些:

  1. std::vector<std::string> args;
  2. args.push_back("-i"); args.push_back("input.mp4");
  3. args.push_back("-filter_complex");
  4. 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]");
  5. args.push_back("-map"); args.push_back("[v1out]");
  6. args.push_back("-c:v:0"); args.push_back("libx264");
  7. args.push_back("-x264-params"); args.push_back("nal-hrd=cbr:force-cfr=1");
  8. args.push_back("-b:v:0"); args.push_back("1M");
  9. args.push_back("-maxrate:v:0"); args.push_back("2M");
  10. args.push_back("-minrate:v:0"); args.push_back("2M");
  11. args.push_back("-bufsize:v:0"); args.push_back("2M");
  12. args.push_back("-preset"); args.push_back("fast");
  13. args.push_back("-g"); args.push_back("48");
  14. args.push_back("-sc_threshold"); args.push_back("0");
  15. args.push_back("-keyint_min"); args.push_back("48");
  16. args.push_back("-map"); args.push_back("[v2out]");
  17. args.push_back("-c:v:1"); args.push_back("libx264");
  18. args.push_back("-x264-params"); args.push_back("nal-hrd=cbr:force-cfr=1");
  19. args.push_back("-b:v:1"); args.push_back("1M");
  20. args.push_back("-maxrate:v:1"); args.push_back("1M");
  21. args.push_back("-minrate:v:1"); args.push_back("1M");
  22. args.push_back("-bufsize:v:1"); args.push_back("1M");
  23. args.push_back("-preset"); args.push_back("fast");
  24. args.push_back("-g"); args.push_back("48");
  25. args.push_back("-sc_threshold"); args.push_back("0");
  26. args.push_back("-keyint_min"); args.push_back("48");
  27. args.push_back("-map"); args.push_back("[v3out]");
  28. args.push_back("-c:v:2"); args.push_back("libx264");
  29. args.push_back("-x264-params"); args.push_back("nal-hrd=cbr:force-cfr=1");
  30. args.push_back("-b:v:2"); args.push_back("500K");
  31. args.push_back("-maxrate:v:2"); args.push_back("500K");
  32. args.push_back("-minrate:v:2"); args.push_back("500K");
  33. args.push_back("-bufsize:v:2"); args.push_back("500K");
  34. args.push_back("-preset"); args.push_back("fast");
  35. args.push_back("-g"); args.push_back("48");
  36. args.push_back("-sc_threshold"); args.push_back("0");
  37. args.push_back("-keyint_min"); args.push_back("48");
  38. args.push_back("-map"); args.push_back("a:0");
  39. args.push_back("-c:a:0"); args.push_back("aac");
  40. args.push_back("-b:a:0"); args.push_back("96k");
  41. args.push_back("-ac"); args.push_back("2");
  42. args.push_back("-map"); args.push_back("a:0");
  43. args.push_back("-c:a:1"); args.push_back("aac");
  44. args.push_back("-b:a:1"); args.push_back("96k");
  45. args.push_back("-ac"); args.push_back("2");
  46. args.push_back("-map"); args.push_back("a:0");
  47. args.push_back("-c:a:2"); args.push_back("aac");
  48. args.push_back("-b:a:2"); args.push_back("48k");
  49. args.push_back("-ac"); args.push_back("2");
  50. args.push_back("-avoid_negative_ts"); args.push_back("1");
  51. args.push_back("-f"); args.push_back("hls");
  52. args.push_back("-hls_time"); args.push_back("6");
  53. args.push_back("-hls_list_size"); args.push_back("15");
  54. args.push_back("-hls_flags"); args.push_back("independent_segments");
  55. args.push_back("-hls_segment_type"); args.push_back("mpegts");
  56. args.push_back("-hls_segment_filename"); args.push_back("/output/stream_%v_data%02d.ts");
  57. args.push_back("-master_pl_name"); args.push_back("index.m3u8");
  58. args.push_back("-var_stream_map"); args.push_back("v:0,a:0 v:1,a:1 v:2,a:2");
  59. args.push_back("/output/stream_%v.m3u8");

我也会考虑换个说法

  1. std::vector<std::string> args{
  2. "-i", "input.mp4", //
  3. "-filter_complex", //
  4. "[0:v]split=3[v1][v2][v3];[v1]copy[v1out];[v2]scale=w=1280:h=720[v2out];[v3]scale=w=640:h=360[v3out]", //
  5. "-map", "[v1out]",
  6. "-c:v:0", "libx264",
  7. "-x264-params", "nal-hrd=cbr:force-cfr=1",
  8. "-b:v:0", "1M",
  9. "-maxrate:v:0", "2M",
  10. "-minrate:v:0", "2M",
  11. "-bufsize:v:0", "2M",
  12. "-preset", "fast",
  13. "-g", "48",
  14. "-sc_threshold", "0",
  15. "-keyint_min", "48",
  16. "-map", "[v2out]",
  17. "-c:v:1", "libx264",
  18. "-x264-params", "nal-hrd=cbr:force-cfr=1",
  19. "-b:v:1", "1M",
  20. "-maxrate:v:1", "1M",
  21. "-minrate:v:1", "1M",
  22. "-bufsize:v:1", "1M",
  23. "-preset", "fast",
  24. "-g", "48",
  25. "-sc_threshold", "0",
  26. "-keyint_min", "48",
  27. "-map", "[v3out]",
  28. "-c:v:2", "libx264",
  29. "-x264-params", "nal-hrd=cbr:force-cfr=1",
  30. "-b:v:2", "500K",
  31. "-maxrate:v:2", "500K",
  32. "-minrate:v:2", "500K",
  33. "-bufsize:v:2", "500K",
  34. "-preset", "fast",
  35. "-g", "48",
  36. "-sc_threshold", "0",
  37. "-keyint_min", "48",
  38. "-map", "a:0",
  39. "-c:a:0", "aac",
  40. "-b:a:0", "96k",
  41. "-ac", "2",
  42. "-map", "a:0",
  43. "-c:a:1", "aac",
  44. "-b:a:1", "96k",
  45. "-ac", "2",
  46. "-map", "a:0",
  47. "-c:a:2", "aac",
  48. "-b:a:2", "48k",
  49. "-ac", "2",
  50. "-avoid_negative_ts", "1",
  51. "-f", "hls",
  52. "-hls_time", "6",
  53. "-hls_list_size", "15",
  54. "-hls_flags", "independent_segments",
  55. "-hls_segment_type", "mpegts",
  56. "-hls_segment_filename", "/output/stream_%v_data%02d.ts",
  57. "-master_pl_name", "index.m3u8",
  58. "-var_stream_map", "v:0,a:0 v:1,a:1 v:2,a:2",
  59. "/output/stream_%v.m3u8"
  60. };
展开查看全部

相关问题