Hi, I'm working on a project using a QProcess to call a script to segment video files using ffmpeg. The idea is to call within the script the command to segment a video file into many chunks of a few seconds, selected by the user. The script also converts the video file from mkv to mp4, but that does not seem to have any issues. I have tested the script from the command line and it works just fine, however when I call it with a QProcess in my code the video segments have a wrong length (should be 30 seconds but are of less than a second in duration).

The script has as arguments the directory of the video file and the duration of the segments, and is called from within a method like so:

Qt Code:
  1. QProcess *process = new QProcess();
  2. connect(process, &QProcess::readyReadStandardError,
  3. this, &GStreamerManager::readyReadStandardError);
  4. connect(process, &QProcess::readyReadStandardOutput,
  5. this, &GStreamerManager::readyReadStandardOutput);
  6.  
  7. QTime t;
  8. t.restart();
  9. QLOG_INFO() << "Segmenting video file into mp4 files...";
  10. QStringList arguments;
  11. arguments << video_finfo.absoluteFilePath()
  12. << QString::number(_params.video_split_interval_s);
  13. QLOG_INFO() << arguments;
  14. process->start("mkv2mp4s", arguments);
  15. process->waitForFinished();
  16. QLOG_INFO() << QString("Command %1 exited with code %2")
  17. .arg(process->program()).arg(process->exitCode());
  18. QLOG_INFO() << QString("MP4 converted! Delay %1 mseconds").arg(t.elapsed());
To copy to clipboard, switch view to plain text mode 


The script, mkv2mp4s goes like so:

Qt Code:
  1. #!/bin/bash
  2.  
  3. # Author: Leandro Candau Sánchez de Ybargüen
  4. # Description: Split a mkv to many mp4 videos using ffmpeg
  5. # Exit values: 0: No error | 1: Wrong arguments | 2: ffmpeg not installed | 3: Error mp4 split |
  6. # 4: Error mp4 creation | 5: Error mkv split
  7.  
  8. function echo_error {
  9. echo $1 1>&2
  10. }
  11.  
  12. if [ $# -ne 2 ]; then
  13. echo "Usage: $0 <path_to_video> <split_time_s>"
  14. exit 1
  15. fi
  16.  
  17. if ! command -v ffmpeg > /dev/null; then
  18. echo_error "ffmpeg is not installed. Please install FFmpeg package."
  19. exit 2
  20. fi
  21.  
  22. input_mkv_path=$1
  23. split_time_s=$2
  24. exit_value=0
  25. video_basename="$(dirname "$input_mkv_path")/$(basename "$input_mkv_path" .mkv)"
  26. output_mp4_path="$(dirname "$input_mkv_path")/$(basename "$input_mkv_path" .mkv).mp4"
  27. output_mp4_split="$(dirname "$input_mkv_path")/$(basename "$input_mkv_path" .mkv)_%d.mp4"
  28. input_mkv_split="$(dirname "$input_mkv_path")/$(basename "$input_mkv_path" .mkv)_%d.mkv"
  29.  
  30. echo "Path to mkv: "$input_mkv_path""
  31. echo "Video split seconds: "$split_time_s""
  32. echo "Output mp4: "$output_mp4_path""
  33. echo "Output mp4 split: "$output_mp4_split""
  34.  
  35. echo "Creating mp4 video $output_mp4_path from mkv $input_mkv_path..."
  36. {
  37. ffmpeg -i $input_mkv_path -codec copy $output_mp4_path
  38. } &> /dev/null
  39.  
  40. if test -f "$output_mp4_path"; then
  41. echo "New video file "$output_mp4_path" has been created"
  42. echo "Removing old mkv file..."
  43. rm $input_mkv_path
  44. echo "Spliting mp4 file in "$split_time_s" seconds chunks"
  45. {
  46. ffmpeg -i $output_mp4_path -c copy -segment_time $split_time_s -f segment $output_mp4_split
  47. } &> /dev/null
  48. if ls ""$video_basename"_0.mp4" 1> /dev/null 2>&1; then
  49. echo "Removing old mp4 file..."
  50. rm $output_mp4_path
  51. else
  52. echo_error "Split files do not exist!"
  53. exit_value=3
  54. fi
  55. else
  56. echo_error "mp4 creation failed!"
  57. exit_value=4
  58. echo "Spliting mkv file in "$split_time_s" seconds chunks"
  59. {
  60. ffmpeg -i $input_mkv_path -c copy -segment_time $split_time_s -f segment $input_mkv_split
  61. } &> /dev/null
  62. if ls ""$video_basename"_0.mkv" 1> /dev/null 2>&1; then
  63. echo "Removing old mkv file..."
  64. rm $input_mkv_path
  65. else
  66. echo_error "Split mkv files do not exist!"
  67. exit_value=5
  68. fi
  69. fi
  70.  
  71. # Format the file name from basefile_<0|1|2...>.mp4|mkv to basefile_<offset_seconds>.mp4|mkv
  72. for filename in $(dirname "$input_mkv_path")/$(basename "$input_mkv_path" .mkv)_*.m*; do
  73. substring=$(echo $filename | grep -oP "_\d+\.") # substring con el patron _#.
  74. value=$(echo $substring | grep -oP "\d+") # valor de # del string anterior
  75. value=_$(( $value*$split_time_s )). # valor # * split_time_s
  76. new_filename=${filename/$substring/$value}
  77. if [ $new_filename != $filename ]; then # evita warning en el _0 pq se llama igual
  78. mv $filename ${filename/$substring/$value} # el string original reemplazando substring por _value.
  79. fi
  80. done
  81.  
  82. exit $exit_value
To copy to clipboard, switch view to plain text mode 

I would appreciate any insight on how to deal with this. Thanks.