The -t option of ffplay won't stop playback - ffmpeg

Just getting started with ffmpeg and ffplay. I do this:
ffplay -t 5 somesong.mp3
and it gets to about 5 seconds and then just starts making a clicking noise?
I'm using the latest version I just downloaded from their site.
(Windows 7 64-bit)

To make ffplay exit automatically when the maximum duration is reached you need to use the autoexit option, otherwise it just cuts the input and waits:
ffplay -autoexit -t 5 somesong.mp3

Related

Including Youtube-dl in FFMPEG not working in Bash (OSX)

I am trying to download 5 second samples for a list of youtube video. The traditional approach is to download the entire file with "youtube-dl" and then use "ffmpeg" to split it however you want it.
I am trying to use the following method: https://github.com/ytdl-org/youtube-dl/issues/622#issuecomment-162337869
It does work when I include the variables in the command, for example:
ffmpeg -ss 0 -i $(youtube-dl -f best --get-url https://www.youtube.com/watch?v=ySVi-0RS5vI&t=5s) -t 10 -c:v copy -c:a copy title2.mp4
However, I am having issues trying to automate the system. Specifically, I would like ffmpeg and youtube-dl to read a file and use the values. I created the file "youtube.txt" which includes the following codes:
440.8,https://www.youtube.com/watch?v=0-4wOE_DNeA,661.2,881.6,0-4wOE_DNeA
330,https://www.youtube.com/watch?v=0-AMWW6tHzw,495,660,0-AMWW6tHzw
509.2,https://www.youtube.com/watch?v=0-Rmto2rgMw,763.8,1018.4,0-Rmto2rgMw
427.6,https://www.youtube.com/watch?v=0-U53qm45cA,641.4,855.2,0-U53qm45cA
320.4,https://www.youtube.com/watch?v=0-dja9Ys4Sg,480.6,640.8,0-dja9Ys4Sg
343.6,https://www.youtube.com/watch?v=0-g_PulsqtM,515.4,687.2,0-g_PulsqtM
415.6,https://www.youtube.com/watch?v=0-nniRyn7dU,623.4,831.2,0-nniRyn7dU
431.2,https://www.youtube.com/watch?v=006BQU3BFxw,646.8,862.4,006BQU3BFxw
I am using the following command:
parallel -j 6 --colsep ',' ffmpeg -ss {1} -i $(youtube-dl -f best --get-url {2}) --t 5 -c:v copy -c:a copy {5} :::: youtube.txt
However, I get the following errors:
ERROR: '{2}' is not a valid URL. Set --default-search "ytsearch" (or run youtube-dl "ytsearch:{2}" ) to search YouTube
--t: No such file or directory
Would you mind helping me?
Thanks!
Here's a solution using python2, so this should work on the python version shipped with MacOS. My original bash script was choking on the csv line reading for some reason. Add this script to getvids.py in the same directory as your youtube.txt, then run chmod +x getvids.py and when you're ready to turn it loose ./getvids.py
#!/usr/bin/python
import csv, os
with open('youtube.txt') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
starttimes = [row[0], row[2], row[3]]
yturl = os.popen('youtube-dl -f best --get-url '+row[1]).read().strip()
for thistime in starttimes:
print(row[1] + ' #time='+thistime)
os.system('ffmpeg -hide_banner -loglevel panic -ss '
+thistime+' -i "'+yturl+'" -t 5 -c copy '+row[4]+'['+thistime+'s].mp4')

Limit cpu limit of process in a loop

I am trying to execute ffmpeg in a loop over multiple files. I only want one instance to run at a time, and to only use 50% of the cpu. I've been trying cpulimit but it isn't playing nice with the loop.
for i in {1..9}; do cpulimit -l 50 -- ffmpeg <all the options>; done
This spawns all nine jobs at once, and they are all owned by init so I have to open htop to kill them.
for i in {1..9}; do ffmpeg <all the options> & cpulimit -p $! -l 50; done
This hangs, ctrl+c continues to the next loop iteration. These instances can only be killed by SIGKILL.
Using a queue is the way to go. A simple solution that I use is Task Spooler. You can limit the number of cores ffmpeg uses with -threads also. Here's some code for you:
ts sh -c "ffmpeg -i INPUT.mp4 -threads 4 OUTPUT.mp4"
You can set the max number of simultaneous tasks to 1 with: ts -S 1
To see the current queue just run ts
You should run it in foreground. In this way the loop will work as expected.
$ cpulimit --help
...
-f --foreground launch target process in foreground and wait for it to exit
This works for me.
for file in *.mp4; do
cpulimit -f -l 100 -- ffmpeg -i "$file" <your options>
done
If you want the -threads option to have an effect on the encoder, you should put it after the -i argument, before the output filename - your current option only tells the decoding part to use a single thread. So to keep it all using a single thread, you want -threads 1 both before and after the -i option. so you can do it like:
ffmpeg -threads 1 -i INPUT.mp4 -threads 1 OUTPUT.mp4

Raspberry Pi ffmpeg video4linux2, v4l2 mmap no such device

On my Raspberry pi I've installed ffmpeg. At the begin I type
uv4l --driver raspicam --auto-video_nr --width 640 --height 480 --encoding jpeg
to run driver. Then I check if devoce0 is registered:
ls -la /dev/video*
and it returns video0 so it is registered. Then I type command to run server:
ffmpeg -v verbose -r 5 -s 640x480 -f video4linux2 -i /dev/video0 http://localhost/webcam.ffm
and the camera lights up for a while and then turns off and I get error like bellow:
[video4linux2, v4l2] mmap: No such device /dev/video0: No such device
What I should do to resolve it? It looks like internal error one of these libraries.
This command works:
uv4l --driver raspicam --auto-video_nr --encoding h264 --width 640 --height 480 --enable-server on
Try adding the following line at the bottom of the file /etc/modules and rebooting your Raspberry Pi.
bcm2835-v4l2
Mine now looks like this in toto:
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
bcm2835-v4l2
This ensures that the Broadcom Video For Linux 2 (v4l2) driver is loaded at all subsequent reboots.

Keep FFMPEG encoding session running

I am trying to encode an external HLS (m3u8) link into MPEG-TS over UDP via ffmpeg with this command:
ffmpeg -re -i http://example.com/index400.m3u8 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:10000?pkt_size=1316
Currently I am executing the command directly inside a terminal which I keep open on my Centos server. However, and after some time (volatile), I get the following error :
Failed to resolve hostname example.com: Temporary failure in name resolution
[hls,applehttp # 0x349b420] Failed to reload playlist 0
My question is, how can I run this command in a bash script or upstart or … so that whenever it unexpectedly stops, it automatically restarts.
I prefer not to use third parties like monit, and please be explicit in writing the script with annotation for newbies, I am not well experienced on this.
Turned out to be simpler than I thought. For future reference, this is what I did, in a terminal:
Create a new script:
vi test.sh
Insert the following code:
#!/bin/bash
while :
do
echo `ffmpeg -re -i http://example.com/index400.m3u8 -vcodec copy -acodec copy -f mpegts udp://127.0.0.1:10000?pkt_size=1316`
done
Press Esc W Q Enter to save and exit.
Execute the following commands:
chmod +x test.sh
./test.sh
And voilà, ffmpeg will automatically restart when an error occurs.

youtube-dl download one minute per every 5 minutes (on a twitch video, but i have the local file saved too if easier)

I would like to do what the title says
This is a ffmpeg command to download from a specific time in a video, offline or online.
ffmpeg -ss (stop time) -i (direct video link) -t (start time) -c:v copy -c:a copy (title.mp4)
I am going to be downloading this on OSX.
I dont care what the title is.
I think* there is a bash command that allows me to change the timings in this command up by a specific amount (+300 seconds per, the counter for start and stop time is in raw seconds)
So, bash script that runs that command but increases the start and stop times incrementally by 300 (the stop timing being 60+ seconds ahead), downloads, then repeats.
here it is:
contents of youtube-dl:
#!/usr/bin/env bash
# set start to 0, 300, 600... up to 72000 (20 hours)
for start in `seq 0 300 72000`; do
# set the outfile name
file="$2.$start.60.mp4"
ffmpeg -ss $start -i "$1" -t 60 -c:v copy -c:a copy "$file"
# get the duration of the last outfile
last_duration=`ffprobe -i "$file" -show_entries format=duration -v quiet -of csv="p=0"`
# if last outfile's duration isn't greater than a second, delete it and stop
[[ ! "$last_duration" -gt 1 ]] && rm -f $file && exit
done
then do:
chmod +x youtube-dl
usage:
./youtube-dl "http://your/movie.flv" title
ps: i discovered that your ffmpeg command was a little broken: it's -t (duration), not -t (start time).
refs:
ffmpeg usage (slhck, 2012)
ffprobe usage (ivan-neeson, 2014)

Resources