Script to reencode all files in a directory


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Script to reencode all files in a directory
# 1  
Old 10-26-2019
Script to reencode all files in a directory

Hello. I usually reencode many video files with this ffmpeg command or similar

Code:
ffmpeg -y -i -c:a copy -vf scale=720:-2 -c:v mpeg4 -vtag xvid -b:v 969k -r 25 -pass 1 -an -f avi /dev/null && ffmpeg -i  -c:a libmp3lame -b:a 48k -ac 1 -vf scale=720:-2,subtitles=1.srt:force_style='Fontsize=20' -c:v mpeg4 -vtag xvid -b:v 969k -r 25 -pass 2 /.avi

So I would like to insert the parameters of this ffmpeg command on a script that reencodes all the videos on a certain directory. I tried to adapt a script that I found for it

Code:
for f in $(find -type f -name *.mkv); do ffmpeg -n -y -i "$f.mkv" -vf scale=720:-2 -c:v mpeg4 -vtag xvid -b:v 969k -r 25 -pass 1 -an -f avi /dev/null && ffmpeg -n -i "$f" -c:a libmp3lame -b:a 48k -ac 1 -vf scale=720:-2,subtitles="$f.srt":force_style='Fontsize=20' -c:v mpeg4 -vtag xvid -b:v 969k -r 25 -pass 2  ".$f.avi" ; done

However, when I try to run this script. it says that cannot find such file or directory. This happens because its treating every word separated by a blank space of the file's name as a file on its own.

So how can I solve this question. Also warns about any possible errors that might arise are welcome. Thank you
# 2  
Old 10-26-2019
Try using shell continuation "markers " the backslash \ Also added { }
Code:
for f in $(find . -type f -name '*.mkv'); 
do 
   ffmpeg -n -y -i "${f}" -vf scale=720:-2 -c:v mpeg4 -vtag xvid -b:v 969k \
           -r 25 -pass 1 -an -f avi /dev/null && \
   ffmpeg -n -i "${f}" -c:a libmp3lame -b:a 48k \
           -ac 1 -vf scale=720:-2,subtitles="${f}.srt":force_style='Fontsize=20' \
           -c:v mpeg4 -vtag xvid -b:v 969k -r 25 -pass 2 ".${f}.avi" ; 
done

I cannot vouch for the correctness your ffmpeg commands at all. Try it.

Last edited by jim mcnamara; 10-26-2019 at 09:17 PM..
# 3  
Old 10-27-2019
Yes, quote *.mkv in the find argument, and do not add another .mkv to $f!

If space characters are your problem, use
Code:
IFS=

so the for list splits on newline only.

More robust (with special characters) is a while loop
Code:
find . -type f -name "*.mkv" | while IFS= read -r f; do ... ; done

Or
Code:
while IFS= read -r f; do ... ; done < <(find . -type f -name "*.mkv")

A last possibility is find -exec:
Code:
find . -type f -name "*.mkv" -exec /bin/sh 'f=$1; ... ' sh {} \;

(Note that one must provide $0, the script name, here: sh.)
This User Gave Thanks to MadeInGermany For This Post:
# 4  
Old 10-28-2019
Hi MadeInGermany. I tried your script. I end receiving many messages like;

Quote:
[h264 @ 0x41456c0] nal_unit_type: 1, nal_ref_idc: 0
Clipping frame in rate conversion by 0.020821
[h264 @ 0x4162a00] nal_unit_type: 1, nal_ref_idc: 2
[h264 @ 0x4138440] nal_unit_type: 1, nal_ref_idc: 0
[h264 @ 0x41456c0] nal_unit_type: 1, nal_ref_idc: 2
[h264 @ 0x4162a00] nal_unit_type: 1, nal_ref_idc: 0
[h264 @ 0x4138440] nal_unit_type: 1, nal_ref_idc: 0
[h264 @ 0x41456c0] nal_unit_type: 1, nal_ref_idc: 2
[h264 @ 0x4162a00] nal_unit_type: 1, nal_ref_idc: 0
[h264 @ 0x4138440] nal_unit_type: 1, nal_ref_idc: 2
[h264 @ 0x41456c0] nal_unit_type: 1, nal_ref_idc: 0
[h264 @ 0x4162a00] nal_unit_type: 1, nal_ref_idc: 0
Quote:

Enter command: <target>|all <time>|-1 <command>[ <argument>]

Parse error, at least 3 arguments were expected, only 1 given in string 'T TO 2012 OLYMPICS-qK8cJH_b5fQ.mp4'
then:

Quote:
Clipping frame in rate conversion by 0.344780
[h264 @ 0x5a036c0] nal_unit_type: 1, nal_ref_idc: 2
and finally

Quote:
[h264 @ 0x4f10a00] nal_unit_type: 1, nal_ref_idc: 0
Clipping frame in rate conversion by 0.065620
[mpeg4 @ 0x4f0c2a0] P qp:236<2108.0<3658 5337 want:215699 total:218738 comp:0.240138 st_q:2108.04 size:8624 var:4332426/460252 br:969 fps:25
stream #0:
keyframe=0
duration=0.042
dts=222.722 pts=222.806
size=6954
It ends reencoding only the first video in the dir.
# 5  
Old 10-28-2019
Try to redirect stdin:
Code:
  </dev/null ffmpeg ...

Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Script to keep checking the directory for files.

Hello Folks, Looking for a script which can keep doing ls to the directories and once file landed to the directory then ,read the files do further calculation and exit. Kindly guide. Regards, Sadique (3 Replies)
Discussion started by: sadique.manzar
3 Replies

2. Shell Programming and Scripting

Moving Files one directory to another directory shell script

Hi, Could you please assist how to move the gz files which are older than the 90 days from one folder to another folder ,before that it need to check the file system named "nfs" if size is less than 90 or not. If size is above 90 then it shouldn't perform file move and exit the script throwing... (4 Replies)
Discussion started by: venkat918
4 Replies

3. UNIX for Dummies Questions & Answers

Script to remove zip files from a directory

Hi Folks, There is a job which generates a .zip files every day at /usr/app/generated directory , now please advise for the script that will delete this zip files permanently.but while deleting it should make sure that it will not delete the last two days recently generated zip files and this... (1 Reply)
Discussion started by: punpun66
1 Replies

4. Shell Programming and Scripting

How to check whether directory has files in it or not in shell script?

hi, I am having script in which i want to check if directory has any file in it or not. If directory contains a single or more files then and only then it should proceed to further operations... P.S.: Directory might have thousand number of files. so there might be chance of getting error... (4 Replies)
Discussion started by: VSom007
4 Replies

5. Shell Programming and Scripting

Script which removes files from the first directory if there is a file in the second directory

Script must removes files from the first directory if there is a file with same name in the second directory Script passed to the two directories, it lies with them in one directory: sh script_name dir1 dir2 This is my version, but it does not work :wall: set - $2/* for i do set -... (6 Replies)
Discussion started by: SLAMUL
6 Replies

6. UNIX for Dummies Questions & Answers

Reading files in script from another directory

Hi I'm trying to call my files from different directories in my script. Can you please help me. Here is my script: #!/bin/bash #---------------------------------------------------------------------------------------------------------------------- #This script allows the user... (1 Reply)
Discussion started by: ladyAnne
1 Replies

7. Shell Programming and Scripting

How to execute script on files in another directory?

Hi Guys, Is there any way I can execute my bash script on files in a different folder than what the script is in? Here is an excerpt of my script: #!/usr/bin/bash input_path="/cygdrive/c/files" output_path="/cygdrive/c/files/data" #script uses files from /cygdrive/c/files directory,... (1 Reply)
Discussion started by: npatwardhan
1 Replies

8. Shell Programming and Scripting

script to count files in a directory

Hello, I was wondering if anyone had an answer for this? thanks, KW (3 Replies)
Discussion started by: kwa71
3 Replies

9. Shell Programming and Scripting

Go Thru Files in a directory:Script

Hi, I am new to unix scripting and I need to write a script that accepts a directory name as an argument, and inside the script to go through all the ".dat" files in that directory. For each ".dat" file in the directory, create a control file(.ctl) file containing the associated ".dat" file name... (0 Replies)
Discussion started by: Axis99
0 Replies
Login or Register to Ask a Question