How can I remove multiple segments from a video using FFmpeg?
I am trying to delete a few sections of a video using FFmpeg.
For example, imagine if you recorded a show on television and wanted to cut out the commercials. This is simple with a GUI video-editor; you just mark the beginning and ending of each clip to be removed, and select delete. I am trying to do the same thing from the command-line with FFmpeg.
I know how to cut a single segment to a new video like so:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
This cuts a five-second clip and saves it as a new video file, but how can I do the opposite and save the whole video without the specified clip, and how I can I specify multiple clips to be removed?
For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
ffmpeg video-editing mp4
|
show 4 more comments
I am trying to delete a few sections of a video using FFmpeg.
For example, imagine if you recorded a show on television and wanted to cut out the commercials. This is simple with a GUI video-editor; you just mark the beginning and ending of each clip to be removed, and select delete. I am trying to do the same thing from the command-line with FFmpeg.
I know how to cut a single segment to a new video like so:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
This cuts a five-second clip and saves it as a new video file, but how can I do the opposite and save the whole video without the specified clip, and how I can I specify multiple clips to be removed?
For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
ffmpeg video-editing mp4
possible duplicate of Splitting video in multiple episodes with ffmpeg, also perhaps check out Using FFMpeg to cut a video into 2 minute clips
– Ƭᴇcʜιᴇ007
Nov 28 '13 at 20:18
That is not what I am asking, I would like to get it all in one "episode", but this would have different sections from the original video.
– Matias
Nov 29 '13 at 15:21
@Matias, if you were asking how to cut a few clips out of the video and leave the rest as is, that would be one thing, but you want to take a few clips from it and combine them with clips from other videos which makes this not a separate, unique question. You have to do what the other questions asked to get the separate segments, then combine them.
– Synetech
Nov 29 '13 at 16:47
@Synetech thanks for your answers. I do not want to combine them with clips from other videos. I just want to remove some parts from the videos. For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
– Matias
Nov 29 '13 at 17:10
@Synetech That wasn't me, it was Tog who must have missunderstood.
– Matias
Nov 29 '13 at 17:47
|
show 4 more comments
I am trying to delete a few sections of a video using FFmpeg.
For example, imagine if you recorded a show on television and wanted to cut out the commercials. This is simple with a GUI video-editor; you just mark the beginning and ending of each clip to be removed, and select delete. I am trying to do the same thing from the command-line with FFmpeg.
I know how to cut a single segment to a new video like so:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
This cuts a five-second clip and saves it as a new video file, but how can I do the opposite and save the whole video without the specified clip, and how I can I specify multiple clips to be removed?
For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
ffmpeg video-editing mp4
I am trying to delete a few sections of a video using FFmpeg.
For example, imagine if you recorded a show on television and wanted to cut out the commercials. This is simple with a GUI video-editor; you just mark the beginning and ending of each clip to be removed, and select delete. I am trying to do the same thing from the command-line with FFmpeg.
I know how to cut a single segment to a new video like so:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
This cuts a five-second clip and saves it as a new video file, but how can I do the opposite and save the whole video without the specified clip, and how I can I specify multiple clips to be removed?
For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
ffmpeg video-editing mp4
ffmpeg video-editing mp4
edited Apr 2 '14 at 9:15
Der Hochstapler
67.3k49230284
67.3k49230284
asked Nov 28 '13 at 20:09
Matias
4381411
4381411
possible duplicate of Splitting video in multiple episodes with ffmpeg, also perhaps check out Using FFMpeg to cut a video into 2 minute clips
– Ƭᴇcʜιᴇ007
Nov 28 '13 at 20:18
That is not what I am asking, I would like to get it all in one "episode", but this would have different sections from the original video.
– Matias
Nov 29 '13 at 15:21
@Matias, if you were asking how to cut a few clips out of the video and leave the rest as is, that would be one thing, but you want to take a few clips from it and combine them with clips from other videos which makes this not a separate, unique question. You have to do what the other questions asked to get the separate segments, then combine them.
– Synetech
Nov 29 '13 at 16:47
@Synetech thanks for your answers. I do not want to combine them with clips from other videos. I just want to remove some parts from the videos. For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
– Matias
Nov 29 '13 at 17:10
@Synetech That wasn't me, it was Tog who must have missunderstood.
– Matias
Nov 29 '13 at 17:47
|
show 4 more comments
possible duplicate of Splitting video in multiple episodes with ffmpeg, also perhaps check out Using FFMpeg to cut a video into 2 minute clips
– Ƭᴇcʜιᴇ007
Nov 28 '13 at 20:18
That is not what I am asking, I would like to get it all in one "episode", but this would have different sections from the original video.
– Matias
Nov 29 '13 at 15:21
@Matias, if you were asking how to cut a few clips out of the video and leave the rest as is, that would be one thing, but you want to take a few clips from it and combine them with clips from other videos which makes this not a separate, unique question. You have to do what the other questions asked to get the separate segments, then combine them.
– Synetech
Nov 29 '13 at 16:47
@Synetech thanks for your answers. I do not want to combine them with clips from other videos. I just want to remove some parts from the videos. For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
– Matias
Nov 29 '13 at 17:10
@Synetech That wasn't me, it was Tog who must have missunderstood.
– Matias
Nov 29 '13 at 17:47
possible duplicate of Splitting video in multiple episodes with ffmpeg, also perhaps check out Using FFMpeg to cut a video into 2 minute clips
– Ƭᴇcʜιᴇ007
Nov 28 '13 at 20:18
possible duplicate of Splitting video in multiple episodes with ffmpeg, also perhaps check out Using FFMpeg to cut a video into 2 minute clips
– Ƭᴇcʜιᴇ007
Nov 28 '13 at 20:18
That is not what I am asking, I would like to get it all in one "episode", but this would have different sections from the original video.
– Matias
Nov 29 '13 at 15:21
That is not what I am asking, I would like to get it all in one "episode", but this would have different sections from the original video.
– Matias
Nov 29 '13 at 15:21
@Matias, if you were asking how to cut a few clips out of the video and leave the rest as is, that would be one thing, but you want to take a few clips from it and combine them with clips from other videos which makes this not a separate, unique question. You have to do what the other questions asked to get the separate segments, then combine them.
– Synetech
Nov 29 '13 at 16:47
@Matias, if you were asking how to cut a few clips out of the video and leave the rest as is, that would be one thing, but you want to take a few clips from it and combine them with clips from other videos which makes this not a separate, unique question. You have to do what the other questions asked to get the separate segments, then combine them.
– Synetech
Nov 29 '13 at 16:47
@Synetech thanks for your answers. I do not want to combine them with clips from other videos. I just want to remove some parts from the videos. For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
– Matias
Nov 29 '13 at 17:10
@Synetech thanks for your answers. I do not want to combine them with clips from other videos. I just want to remove some parts from the videos. For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
– Matias
Nov 29 '13 at 17:10
@Synetech That wasn't me, it was Tog who must have missunderstood.
– Matias
Nov 29 '13 at 17:47
@Synetech That wasn't me, it was Tog who must have missunderstood.
– Matias
Nov 29 '13 at 17:47
|
show 4 more comments
4 Answers
4
active
oldest
votes
Well, you still can use the trim
filter for that. Here is an example, lets assume that you want to cut out segments 30-40 sec (10 sec) and 50-80 sec (30 sec):
ffmpeg -i in.ts -filter_complex
"[0:v]trim=duration=30[a];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b];
[a][b]concat[c];
[0:v]trim=start=80,setpts=PTS-STARTPTS[d];
[c][d]concat[out1]" -map [out1] out.ts
What I did here? I trimmed first 30 sec, 40-50 sec and 80 sec to end, and then combined them into stream out1
with the concat
filter.
About setpts: we need this because trim does not modify picture display time, and when we cut out 10 sec decoder counter does not see any frames for this 10 sec.
If you want to have audio too, You have to do the same for audio streams. So the command should be:
ffmpeg -i utv.ts -filter_complex
"[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];
[0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];
[av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];
[0:v]trim=start=80,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];
[cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
4
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
1
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
|
show 4 more comments
I can never get ptQa's solution to work, mostly because I can never figure out what the errors from the filters mean or how to fix them. My solution seems a little clunkier because it can leave behind a mess, but if you're throwing it into a script, the clean up can be automated. I also like this approach because if something goes wrong on step 4, you end up with completed steps 1-3 so recovering from errors is a little more efficient.
The basic strategy is using -t
and -ss
to get videos of each segment you want, then join together all the parts for your final version.
Say you have 6 segments ABCDEF each 5 seconds long and you want A (0-5 seconds), C (10-15 seconds) and E (20-25 seconds) you'd do this:
ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow
or
ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow
That will make files a.tvshow, c.tvshow and e.tvshow. The -t
says how long each clip is, so if c is 30 seconds long you could pass in 30 or 0:00:30. The -ss
option says how far to skip into the source video, so it's always relative to the start of the file.
Then once you have a bunch of video files I make a file ace-files.txt
like this:
file 'a.tvshow'
file 'c.tvshow'
file 'e.tvshow'
Note the "file" at the beginning and the escaped file name after that.
Then the command:
ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow
That concats all the files in abe-files.txt
together, copying their audio and video codecs and makes a file ace.tvshow
which should just be sections a, c and e. Then just remember to delete ace-files.txt
, a.tvshow
, c.tvshow
and e.tvshow
.
Disclaimer: I have no idea how (in)efficient this is compared to the other approaches in terms of ffmpeg
but for my purposes it works better. Hope it helps someone.
1
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
2
Note if you are using bash, you can avoid the creation of a file (ace-files.txt
in your example) with:ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
add a comment |
Although the answer provided by ptQa seems to work, I have developed an other solution which has prooved to work fine.
Essentially, what I do is to cut one video for each part of the original video that I want to include on my result. Later, I concatenate them with the Concat Demuxer explained here.
The solution is the same that waht I have tried first and presented sync problems. What I have added is the command -avoid_negative_ts 1 when generating the different videos. With this solution, the sync problems dissapear.
add a comment |
I made a script to speed up editing recorded TV.
The script asks you for the beginning and end times of segments you want to keep and splits them out into files. It gives you options, you can:
- Take one or multiple segments.
- You can combine the segments into one resulting file.
- After joining you can keep or delete the part files.
- You can keep the original file or replace it with your new file.
Video of it in action: here
Let me know what you think.
#!/bin/bash
/bin/date >>segmenter.log
function segment (){
while true; do
echo "Would you like to cut out a segment ?"
echo -e "1) Yesn2) Non3) Quit"
read CHOICE
if [ "$CHOICE" == "3" ]; then
exit
elif [ "$CHOICE" == "2" ]; then
clear
break
elif [ "$CHOICE" == "1" ]; then
clear
((segments++))
echo "What time does segment $segments start ?"
read SEGSTART
clear
echo -e "Segment $segments start set to $SEGSTARTn"
echo "What time does segment $segments end ?"
read SEGEND
clear
echo -e "Segment $segments end set to $SEGENDn"
break
else
clear
echo -e "Bad option"
segment "$segments"
fi
done
if [ "$CHOICE" == "1" ]; then
echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND"
ffmpeg -i "$file" -ss $SEGSTART -to $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy "$filename-part$segments.$extension" >> segmenter.log 2>&1
clear
echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGENDn"
segment "$segments"
fi
}
file="$1"
filename="${file%.*}"
extension="${file##*.}"
clear
segments=0
segment "$segments"
clear
if (("$segments"==1)); then
mv $filename"-part1."$extension "$filename-segmented.$extension"
elif (("$segments">1)); then
echo "Would you like to join the segments into one file ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
clear
echo "Joining segments"
ffmpeg -f concat -i <(for f in $filename"-part"*$extension; do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >> segmenter.log 2>&1
clear
echo "Would you like to delete the part files ?"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
for f in $filename"-part"*$extension; do rm $f; done
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
break
clear
elif [ "$opt" == "No" ]; then
exit
else
clear
echo -e "Bad optionn"
fi
done
fi
echo "Would you like to replace the original file with the result of your changes ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
rm $file
mv "$filename-segmented.$extension" $file
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "3"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f681885%2fhow-can-i-remove-multiple-segments-from-a-video-using-ffmpeg%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
Well, you still can use the trim
filter for that. Here is an example, lets assume that you want to cut out segments 30-40 sec (10 sec) and 50-80 sec (30 sec):
ffmpeg -i in.ts -filter_complex
"[0:v]trim=duration=30[a];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b];
[a][b]concat[c];
[0:v]trim=start=80,setpts=PTS-STARTPTS[d];
[c][d]concat[out1]" -map [out1] out.ts
What I did here? I trimmed first 30 sec, 40-50 sec and 80 sec to end, and then combined them into stream out1
with the concat
filter.
About setpts: we need this because trim does not modify picture display time, and when we cut out 10 sec decoder counter does not see any frames for this 10 sec.
If you want to have audio too, You have to do the same for audio streams. So the command should be:
ffmpeg -i utv.ts -filter_complex
"[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];
[0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];
[av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];
[0:v]trim=start=80,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];
[cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
4
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
1
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
|
show 4 more comments
Well, you still can use the trim
filter for that. Here is an example, lets assume that you want to cut out segments 30-40 sec (10 sec) and 50-80 sec (30 sec):
ffmpeg -i in.ts -filter_complex
"[0:v]trim=duration=30[a];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b];
[a][b]concat[c];
[0:v]trim=start=80,setpts=PTS-STARTPTS[d];
[c][d]concat[out1]" -map [out1] out.ts
What I did here? I trimmed first 30 sec, 40-50 sec and 80 sec to end, and then combined them into stream out1
with the concat
filter.
About setpts: we need this because trim does not modify picture display time, and when we cut out 10 sec decoder counter does not see any frames for this 10 sec.
If you want to have audio too, You have to do the same for audio streams. So the command should be:
ffmpeg -i utv.ts -filter_complex
"[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];
[0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];
[av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];
[0:v]trim=start=80,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];
[cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
4
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
1
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
|
show 4 more comments
Well, you still can use the trim
filter for that. Here is an example, lets assume that you want to cut out segments 30-40 sec (10 sec) and 50-80 sec (30 sec):
ffmpeg -i in.ts -filter_complex
"[0:v]trim=duration=30[a];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b];
[a][b]concat[c];
[0:v]trim=start=80,setpts=PTS-STARTPTS[d];
[c][d]concat[out1]" -map [out1] out.ts
What I did here? I trimmed first 30 sec, 40-50 sec and 80 sec to end, and then combined them into stream out1
with the concat
filter.
About setpts: we need this because trim does not modify picture display time, and when we cut out 10 sec decoder counter does not see any frames for this 10 sec.
If you want to have audio too, You have to do the same for audio streams. So the command should be:
ffmpeg -i utv.ts -filter_complex
"[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];
[0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];
[av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];
[0:v]trim=start=80,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];
[cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts
Well, you still can use the trim
filter for that. Here is an example, lets assume that you want to cut out segments 30-40 sec (10 sec) and 50-80 sec (30 sec):
ffmpeg -i in.ts -filter_complex
"[0:v]trim=duration=30[a];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b];
[a][b]concat[c];
[0:v]trim=start=80,setpts=PTS-STARTPTS[d];
[c][d]concat[out1]" -map [out1] out.ts
What I did here? I trimmed first 30 sec, 40-50 sec and 80 sec to end, and then combined them into stream out1
with the concat
filter.
About setpts: we need this because trim does not modify picture display time, and when we cut out 10 sec decoder counter does not see any frames for this 10 sec.
If you want to have audio too, You have to do the same for audio streams. So the command should be:
ffmpeg -i utv.ts -filter_complex
"[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];
[0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];
[0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];
[av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];
[0:v]trim=start=80,setpts=PTS-STARTPTS[dv];
[0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];
[cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts
edited Apr 1 '14 at 10:48
answered Nov 30 '13 at 20:57
ptQa
1,424812
1,424812
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
4
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
1
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
|
show 4 more comments
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
4
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
1
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Great one! Why do we need setpts? Could you add the explanation?
– Rajib
Dec 1 '13 at 4:32
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
Ok, see updated answer.
– ptQa
Dec 2 '13 at 7:41
4
4
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
+1 This really should be selected as the answer. It is more suited for "multiple segments" and removes the necessity to perform multiple commands one after another. (unless another way is more speed efficient)
– Knossos
Dec 17 '13 at 10:19
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
For the record, when I tried this with serveral segments (about 8) I got an error message about a "buffer queue overflow" and the program crashed. I don't know which versions are affected by this, but I wouldn't want to use this method for that reason.
– Wutaz
Feb 13 '14 at 22:35
1
1
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
How would you go about maintaining subtitle data when you're skipping frames?
– Andrew Scagnelli
Mar 2 '15 at 14:46
|
show 4 more comments
I can never get ptQa's solution to work, mostly because I can never figure out what the errors from the filters mean or how to fix them. My solution seems a little clunkier because it can leave behind a mess, but if you're throwing it into a script, the clean up can be automated. I also like this approach because if something goes wrong on step 4, you end up with completed steps 1-3 so recovering from errors is a little more efficient.
The basic strategy is using -t
and -ss
to get videos of each segment you want, then join together all the parts for your final version.
Say you have 6 segments ABCDEF each 5 seconds long and you want A (0-5 seconds), C (10-15 seconds) and E (20-25 seconds) you'd do this:
ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow
or
ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow
That will make files a.tvshow, c.tvshow and e.tvshow. The -t
says how long each clip is, so if c is 30 seconds long you could pass in 30 or 0:00:30. The -ss
option says how far to skip into the source video, so it's always relative to the start of the file.
Then once you have a bunch of video files I make a file ace-files.txt
like this:
file 'a.tvshow'
file 'c.tvshow'
file 'e.tvshow'
Note the "file" at the beginning and the escaped file name after that.
Then the command:
ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow
That concats all the files in abe-files.txt
together, copying their audio and video codecs and makes a file ace.tvshow
which should just be sections a, c and e. Then just remember to delete ace-files.txt
, a.tvshow
, c.tvshow
and e.tvshow
.
Disclaimer: I have no idea how (in)efficient this is compared to the other approaches in terms of ffmpeg
but for my purposes it works better. Hope it helps someone.
1
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
2
Note if you are using bash, you can avoid the creation of a file (ace-files.txt
in your example) with:ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
add a comment |
I can never get ptQa's solution to work, mostly because I can never figure out what the errors from the filters mean or how to fix them. My solution seems a little clunkier because it can leave behind a mess, but if you're throwing it into a script, the clean up can be automated. I also like this approach because if something goes wrong on step 4, you end up with completed steps 1-3 so recovering from errors is a little more efficient.
The basic strategy is using -t
and -ss
to get videos of each segment you want, then join together all the parts for your final version.
Say you have 6 segments ABCDEF each 5 seconds long and you want A (0-5 seconds), C (10-15 seconds) and E (20-25 seconds) you'd do this:
ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow
or
ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow
That will make files a.tvshow, c.tvshow and e.tvshow. The -t
says how long each clip is, so if c is 30 seconds long you could pass in 30 or 0:00:30. The -ss
option says how far to skip into the source video, so it's always relative to the start of the file.
Then once you have a bunch of video files I make a file ace-files.txt
like this:
file 'a.tvshow'
file 'c.tvshow'
file 'e.tvshow'
Note the "file" at the beginning and the escaped file name after that.
Then the command:
ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow
That concats all the files in abe-files.txt
together, copying their audio and video codecs and makes a file ace.tvshow
which should just be sections a, c and e. Then just remember to delete ace-files.txt
, a.tvshow
, c.tvshow
and e.tvshow
.
Disclaimer: I have no idea how (in)efficient this is compared to the other approaches in terms of ffmpeg
but for my purposes it works better. Hope it helps someone.
1
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
2
Note if you are using bash, you can avoid the creation of a file (ace-files.txt
in your example) with:ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
add a comment |
I can never get ptQa's solution to work, mostly because I can never figure out what the errors from the filters mean or how to fix them. My solution seems a little clunkier because it can leave behind a mess, but if you're throwing it into a script, the clean up can be automated. I also like this approach because if something goes wrong on step 4, you end up with completed steps 1-3 so recovering from errors is a little more efficient.
The basic strategy is using -t
and -ss
to get videos of each segment you want, then join together all the parts for your final version.
Say you have 6 segments ABCDEF each 5 seconds long and you want A (0-5 seconds), C (10-15 seconds) and E (20-25 seconds) you'd do this:
ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow
or
ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow
That will make files a.tvshow, c.tvshow and e.tvshow. The -t
says how long each clip is, so if c is 30 seconds long you could pass in 30 or 0:00:30. The -ss
option says how far to skip into the source video, so it's always relative to the start of the file.
Then once you have a bunch of video files I make a file ace-files.txt
like this:
file 'a.tvshow'
file 'c.tvshow'
file 'e.tvshow'
Note the "file" at the beginning and the escaped file name after that.
Then the command:
ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow
That concats all the files in abe-files.txt
together, copying their audio and video codecs and makes a file ace.tvshow
which should just be sections a, c and e. Then just remember to delete ace-files.txt
, a.tvshow
, c.tvshow
and e.tvshow
.
Disclaimer: I have no idea how (in)efficient this is compared to the other approaches in terms of ffmpeg
but for my purposes it works better. Hope it helps someone.
I can never get ptQa's solution to work, mostly because I can never figure out what the errors from the filters mean or how to fix them. My solution seems a little clunkier because it can leave behind a mess, but if you're throwing it into a script, the clean up can be automated. I also like this approach because if something goes wrong on step 4, you end up with completed steps 1-3 so recovering from errors is a little more efficient.
The basic strategy is using -t
and -ss
to get videos of each segment you want, then join together all the parts for your final version.
Say you have 6 segments ABCDEF each 5 seconds long and you want A (0-5 seconds), C (10-15 seconds) and E (20-25 seconds) you'd do this:
ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow
or
ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow
That will make files a.tvshow, c.tvshow and e.tvshow. The -t
says how long each clip is, so if c is 30 seconds long you could pass in 30 or 0:00:30. The -ss
option says how far to skip into the source video, so it's always relative to the start of the file.
Then once you have a bunch of video files I make a file ace-files.txt
like this:
file 'a.tvshow'
file 'c.tvshow'
file 'e.tvshow'
Note the "file" at the beginning and the escaped file name after that.
Then the command:
ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow
That concats all the files in abe-files.txt
together, copying their audio and video codecs and makes a file ace.tvshow
which should just be sections a, c and e. Then just remember to delete ace-files.txt
, a.tvshow
, c.tvshow
and e.tvshow
.
Disclaimer: I have no idea how (in)efficient this is compared to the other approaches in terms of ffmpeg
but for my purposes it works better. Hope it helps someone.
answered Jan 11 '15 at 20:03
xbakesx
25148
25148
1
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
2
Note if you are using bash, you can avoid the creation of a file (ace-files.txt
in your example) with:ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
add a comment |
1
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
2
Note if you are using bash, you can avoid the creation of a file (ace-files.txt
in your example) with:ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
1
1
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
this one is very understandable for newbies as me, thanks
– juanpastas
Apr 19 '15 at 21:48
2
2
Note if you are using bash, you can avoid the creation of a file (
ace-files.txt
in your example) with: ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
Note if you are using bash, you can avoid the creation of a file (
ace-files.txt
in your example) with: ffmpeg -f concat -i <(printf "file '%s'n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
– bufh
Mar 31 '16 at 19:40
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
This was really helpful but I had to remove the single quotes from around file names or it didn't work.
– tchaymore
Jan 17 '18 at 18:08
add a comment |
Although the answer provided by ptQa seems to work, I have developed an other solution which has prooved to work fine.
Essentially, what I do is to cut one video for each part of the original video that I want to include on my result. Later, I concatenate them with the Concat Demuxer explained here.
The solution is the same that waht I have tried first and presented sync problems. What I have added is the command -avoid_negative_ts 1 when generating the different videos. With this solution, the sync problems dissapear.
add a comment |
Although the answer provided by ptQa seems to work, I have developed an other solution which has prooved to work fine.
Essentially, what I do is to cut one video for each part of the original video that I want to include on my result. Later, I concatenate them with the Concat Demuxer explained here.
The solution is the same that waht I have tried first and presented sync problems. What I have added is the command -avoid_negative_ts 1 when generating the different videos. With this solution, the sync problems dissapear.
add a comment |
Although the answer provided by ptQa seems to work, I have developed an other solution which has prooved to work fine.
Essentially, what I do is to cut one video for each part of the original video that I want to include on my result. Later, I concatenate them with the Concat Demuxer explained here.
The solution is the same that waht I have tried first and presented sync problems. What I have added is the command -avoid_negative_ts 1 when generating the different videos. With this solution, the sync problems dissapear.
Although the answer provided by ptQa seems to work, I have developed an other solution which has prooved to work fine.
Essentially, what I do is to cut one video for each part of the original video that I want to include on my result. Later, I concatenate them with the Concat Demuxer explained here.
The solution is the same that waht I have tried first and presented sync problems. What I have added is the command -avoid_negative_ts 1 when generating the different videos. With this solution, the sync problems dissapear.
answered Dec 2 '13 at 16:02
Matias
4381411
4381411
add a comment |
add a comment |
I made a script to speed up editing recorded TV.
The script asks you for the beginning and end times of segments you want to keep and splits them out into files. It gives you options, you can:
- Take one or multiple segments.
- You can combine the segments into one resulting file.
- After joining you can keep or delete the part files.
- You can keep the original file or replace it with your new file.
Video of it in action: here
Let me know what you think.
#!/bin/bash
/bin/date >>segmenter.log
function segment (){
while true; do
echo "Would you like to cut out a segment ?"
echo -e "1) Yesn2) Non3) Quit"
read CHOICE
if [ "$CHOICE" == "3" ]; then
exit
elif [ "$CHOICE" == "2" ]; then
clear
break
elif [ "$CHOICE" == "1" ]; then
clear
((segments++))
echo "What time does segment $segments start ?"
read SEGSTART
clear
echo -e "Segment $segments start set to $SEGSTARTn"
echo "What time does segment $segments end ?"
read SEGEND
clear
echo -e "Segment $segments end set to $SEGENDn"
break
else
clear
echo -e "Bad option"
segment "$segments"
fi
done
if [ "$CHOICE" == "1" ]; then
echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND"
ffmpeg -i "$file" -ss $SEGSTART -to $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy "$filename-part$segments.$extension" >> segmenter.log 2>&1
clear
echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGENDn"
segment "$segments"
fi
}
file="$1"
filename="${file%.*}"
extension="${file##*.}"
clear
segments=0
segment "$segments"
clear
if (("$segments"==1)); then
mv $filename"-part1."$extension "$filename-segmented.$extension"
elif (("$segments">1)); then
echo "Would you like to join the segments into one file ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
clear
echo "Joining segments"
ffmpeg -f concat -i <(for f in $filename"-part"*$extension; do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >> segmenter.log 2>&1
clear
echo "Would you like to delete the part files ?"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
for f in $filename"-part"*$extension; do rm $f; done
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
break
clear
elif [ "$opt" == "No" ]; then
exit
else
clear
echo -e "Bad optionn"
fi
done
fi
echo "Would you like to replace the original file with the result of your changes ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
rm $file
mv "$filename-segmented.$extension" $file
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
add a comment |
I made a script to speed up editing recorded TV.
The script asks you for the beginning and end times of segments you want to keep and splits them out into files. It gives you options, you can:
- Take one or multiple segments.
- You can combine the segments into one resulting file.
- After joining you can keep or delete the part files.
- You can keep the original file or replace it with your new file.
Video of it in action: here
Let me know what you think.
#!/bin/bash
/bin/date >>segmenter.log
function segment (){
while true; do
echo "Would you like to cut out a segment ?"
echo -e "1) Yesn2) Non3) Quit"
read CHOICE
if [ "$CHOICE" == "3" ]; then
exit
elif [ "$CHOICE" == "2" ]; then
clear
break
elif [ "$CHOICE" == "1" ]; then
clear
((segments++))
echo "What time does segment $segments start ?"
read SEGSTART
clear
echo -e "Segment $segments start set to $SEGSTARTn"
echo "What time does segment $segments end ?"
read SEGEND
clear
echo -e "Segment $segments end set to $SEGENDn"
break
else
clear
echo -e "Bad option"
segment "$segments"
fi
done
if [ "$CHOICE" == "1" ]; then
echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND"
ffmpeg -i "$file" -ss $SEGSTART -to $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy "$filename-part$segments.$extension" >> segmenter.log 2>&1
clear
echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGENDn"
segment "$segments"
fi
}
file="$1"
filename="${file%.*}"
extension="${file##*.}"
clear
segments=0
segment "$segments"
clear
if (("$segments"==1)); then
mv $filename"-part1."$extension "$filename-segmented.$extension"
elif (("$segments">1)); then
echo "Would you like to join the segments into one file ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
clear
echo "Joining segments"
ffmpeg -f concat -i <(for f in $filename"-part"*$extension; do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >> segmenter.log 2>&1
clear
echo "Would you like to delete the part files ?"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
for f in $filename"-part"*$extension; do rm $f; done
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
break
clear
elif [ "$opt" == "No" ]; then
exit
else
clear
echo -e "Bad optionn"
fi
done
fi
echo "Would you like to replace the original file with the result of your changes ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
rm $file
mv "$filename-segmented.$extension" $file
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
add a comment |
I made a script to speed up editing recorded TV.
The script asks you for the beginning and end times of segments you want to keep and splits them out into files. It gives you options, you can:
- Take one or multiple segments.
- You can combine the segments into one resulting file.
- After joining you can keep or delete the part files.
- You can keep the original file or replace it with your new file.
Video of it in action: here
Let me know what you think.
#!/bin/bash
/bin/date >>segmenter.log
function segment (){
while true; do
echo "Would you like to cut out a segment ?"
echo -e "1) Yesn2) Non3) Quit"
read CHOICE
if [ "$CHOICE" == "3" ]; then
exit
elif [ "$CHOICE" == "2" ]; then
clear
break
elif [ "$CHOICE" == "1" ]; then
clear
((segments++))
echo "What time does segment $segments start ?"
read SEGSTART
clear
echo -e "Segment $segments start set to $SEGSTARTn"
echo "What time does segment $segments end ?"
read SEGEND
clear
echo -e "Segment $segments end set to $SEGENDn"
break
else
clear
echo -e "Bad option"
segment "$segments"
fi
done
if [ "$CHOICE" == "1" ]; then
echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND"
ffmpeg -i "$file" -ss $SEGSTART -to $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy "$filename-part$segments.$extension" >> segmenter.log 2>&1
clear
echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGENDn"
segment "$segments"
fi
}
file="$1"
filename="${file%.*}"
extension="${file##*.}"
clear
segments=0
segment "$segments"
clear
if (("$segments"==1)); then
mv $filename"-part1."$extension "$filename-segmented.$extension"
elif (("$segments">1)); then
echo "Would you like to join the segments into one file ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
clear
echo "Joining segments"
ffmpeg -f concat -i <(for f in $filename"-part"*$extension; do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >> segmenter.log 2>&1
clear
echo "Would you like to delete the part files ?"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
for f in $filename"-part"*$extension; do rm $f; done
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
break
clear
elif [ "$opt" == "No" ]; then
exit
else
clear
echo -e "Bad optionn"
fi
done
fi
echo "Would you like to replace the original file with the result of your changes ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
rm $file
mv "$filename-segmented.$extension" $file
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
I made a script to speed up editing recorded TV.
The script asks you for the beginning and end times of segments you want to keep and splits them out into files. It gives you options, you can:
- Take one or multiple segments.
- You can combine the segments into one resulting file.
- After joining you can keep or delete the part files.
- You can keep the original file or replace it with your new file.
Video of it in action: here
Let me know what you think.
#!/bin/bash
/bin/date >>segmenter.log
function segment (){
while true; do
echo "Would you like to cut out a segment ?"
echo -e "1) Yesn2) Non3) Quit"
read CHOICE
if [ "$CHOICE" == "3" ]; then
exit
elif [ "$CHOICE" == "2" ]; then
clear
break
elif [ "$CHOICE" == "1" ]; then
clear
((segments++))
echo "What time does segment $segments start ?"
read SEGSTART
clear
echo -e "Segment $segments start set to $SEGSTARTn"
echo "What time does segment $segments end ?"
read SEGEND
clear
echo -e "Segment $segments end set to $SEGENDn"
break
else
clear
echo -e "Bad option"
segment "$segments"
fi
done
if [ "$CHOICE" == "1" ]; then
echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND"
ffmpeg -i "$file" -ss $SEGSTART -to $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy "$filename-part$segments.$extension" >> segmenter.log 2>&1
clear
echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGENDn"
segment "$segments"
fi
}
file="$1"
filename="${file%.*}"
extension="${file##*.}"
clear
segments=0
segment "$segments"
clear
if (("$segments"==1)); then
mv $filename"-part1."$extension "$filename-segmented.$extension"
elif (("$segments">1)); then
echo "Would you like to join the segments into one file ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
clear
echo "Joining segments"
ffmpeg -f concat -i <(for f in $filename"-part"*$extension; do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >> segmenter.log 2>&1
clear
echo "Would you like to delete the part files ?"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
for f in $filename"-part"*$extension; do rm $f; done
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
break
clear
elif [ "$opt" == "No" ]; then
exit
else
clear
echo -e "Bad optionn"
fi
done
fi
echo "Would you like to replace the original file with the result of your changes ?"
OPTIONS="Yes No Quit"
select opt in $OPTIONS; do
clear
if [ "$opt" == "Quit" ]; then
exit
elif [ "$opt" == "Yes" ]; then
rm $file
mv "$filename-segmented.$extension" $file
break
elif [ "$opt" == "No" ]; then
break
else
clear
echo -e "Bad optionn"
fi
done
edited Feb 21 '14 at 0:26
answered Feb 20 '14 at 21:46
rocuinneagain
112
112
add a comment |
add a comment |
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f681885%2fhow-can-i-remove-multiple-segments-from-a-video-using-ffmpeg%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
possible duplicate of Splitting video in multiple episodes with ffmpeg, also perhaps check out Using FFMpeg to cut a video into 2 minute clips
– Ƭᴇcʜιᴇ007
Nov 28 '13 at 20:18
That is not what I am asking, I would like to get it all in one "episode", but this would have different sections from the original video.
– Matias
Nov 29 '13 at 15:21
@Matias, if you were asking how to cut a few clips out of the video and leave the rest as is, that would be one thing, but you want to take a few clips from it and combine them with clips from other videos which makes this not a separate, unique question. You have to do what the other questions asked to get the separate segments, then combine them.
– Synetech
Nov 29 '13 at 16:47
@Synetech thanks for your answers. I do not want to combine them with clips from other videos. I just want to remove some parts from the videos. For example, if my video could be represented by ABCDEFG, I would like to create a new one that would consist of ACDFG.
– Matias
Nov 29 '13 at 17:10
@Synetech That wasn't me, it was Tog who must have missunderstood.
– Matias
Nov 29 '13 at 17:47