You need to incorporate the relative path of each source file into your destination. That is not trivial to do if you want the script to be bullet proof.
The untested code below uses a batch function to determine the length of a string. There are many techniques for computing string length in batch.
Once I know the length of the root source path, it is easy to do a substring operation on the full path of a source file to get the relative path.
@echo off
setlocal disableDelayedExpansion
REM get absolute path of source and destination roots
for %%F in ("%~1\x") do set "src=%%~dpF"
for %%F in ("%~2\x") do set "dst=%%~dpF"
REM get length of root source path
call :strlen src srcLen
REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %1 to %2 ...
xcopy /T "%src%\." "%dst%\."
REM walk directory structure and convert each file in quiet mode
for /R "%src%" %%F in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
set "file=%%~fF"
set "file2=%%~dpnF"
echo converting "%%~nxF" ...
setlocal enableDelayedExpansion
ffmpeg -v quiet -i "!file!" -vcodec libx264 "!dst!!file2:~%srcLen%!-converted.mp4"
endlocal
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)
exit /b
:strlen strVar [rtnVar]
setlocal EnableDelayedExpansion
set "s=!%~1!#"
set "len=0"
for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
(
endlocal
if "%~2" equ "" (echo %len%) else set "%~2=%len%"
exit /b
)
There is a really simple solution if you have two unassigned drive letters that can be mapped to your root source and destination folders. That would allow you to use the full absolute path (without the drive letter). I'm assuming X: and Y: are available
@echo off
setlocal disableDelayedExpansion
REM map unused drive letters to source and destination
for %%F in ("%~1\.") do subst x: "%%~fF"
for %%F in ("%~2\.") do subst y: "%%~fF"
REM keep a counter for files converted
set /A nfile=0
REM do not copy empty folders or any files
@echo Copying directory structure from %1 to %2 ...
xcopy /T x:\ y:\
REM walk directory structure and convert each file in quiet mode
for /R x:\ %%F in (*.mp4, *.aac, *.flv, *.m4a, *.mp3) do (
echo converting "%%~nxF" ...
ffmpeg -v quiet -i "%%F" -vcodec libx264 "y:%%~pnF-converted.mp4"
set /A nfile+=1
)
echo Done! Converted %nfile% file(s)
exit /b
REM release mapped drive letters
subst /d x:
subst /d y: