ea

出自Tsetien’s Wiki
跳至導覽 跳至搜尋

A tiny little Windows Batch script used for extracting audio tracks from media files. It requires ffmpeg to be properly put into %PATH%.

Use -c to strip metadata from the extracted audio file; use -d to delete the original video file after extraction; and use -t n to designate which audio track should be extracted (eg, if the second audio track is desired, just add -t 2 to the command).

This script serves purely for extraction purposes; for extraction and conversion tasks, please see ca.

A bash version, translated by ChatGPT 5.1, is attached to the end.

The batch

ea.bat
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
set "c="
set "d="
set "e="
set "f="
set "n="
set "t=0"
set "tn="
set "ts="
set "x="
set "int="
set "r32="
set "str=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
for /l %%i in (1,1,32) do (
	set /a int=!random!%%63
	for %%j in (!int!) do set "r32=!r32!!str:~%%j,1!"
)
:a
if /i "%~1"=="" goto p
set "a=%~1"
if /i "!a:~0,1!"=="-" (
	if /i "%~1"=="-c" set "c=1"
	if /i "%~1"=="-d" set "d=1"
	if /i "!a!"=="-t" (set "tn=%~2" & set /a "t=!tn!-1" & set "ts=-t!tn!" & shift)
) else (
	if not defined f set "f=%~1" & set "n=%~n1"
)
shift
goto a
:p
if not defined f goto e
if not defined tn set "t=0" & set "ts="
ffprobe -v error -select_streams a:%t% -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "%f%" > %r32%.txt
for /f "delims=" %%b in (%r32%.txt) do set "e=%%b"
del /q %r32%.txt
if /i "%e%"=="opus" set "x=.opus"
if /i "%e%"=="aac" set "x=.m4a"
if /i "%e%"=="mp3" set "x=.mp3"
if /i "%e%"=="vorbis" set "x=.ogg"
if /i "%e%"=="ac3" set "x=.ac3"
if /i "%e%"=="flac" set "x=.flac"
if /i "%e:~0,3%"=="wma" set "x=.wma"
if /i "%e:~0,4%"=="pcm_" set "x=.wav"
if /i "%e%"=="dts" set "x=.dts"
if /i "%e%"=="eac3" set "x=.eac3"
if /i "%e%"=="alac" set "x=.m4a"
if /i "%e%"=="truehd" set "x=.thd"
if /i "%e%"=="amrnb" set "x=.amr"
if /i "%e%"=="amrwb" set "x=.awb"
if /i "%e%"=="smaf" set "x=.mmf"
if /i "%e%"=="cook" set "x=.ra"
if /i "%e%"=="atrac3" set "x=.at3"
if /i "%e%"=="sipr" set "x=.ra"
if /i "%e%"=="qcelp" set "x=.qcp"
if /i "%e%"=="mp2" set "x=.mp2"
if not defined x goto e
if exist "%n%%ts%%x%" goto e
if not defined c (
	ffmpeg -i "%f%" -map a:%t% -vn -c:a copy "%n%%ts%%x%"
) else (
	ffmpeg -i "%f%" -map a:%t% -vn -c:a copy -map_metadata -1 -map_chapters -1 -metadata:s handler_name= -metadata:s vendor_id= -disposition 0 "%n%%ts%%x%"
)
if not defined d goto e
del /q "%f%"
:e
endlocal

The bash

ea
#!/bin/bash
set -euo pipefail
c=
d=
t=0
tn=
ts=
f=
x=
while [ $# -gt 0 ]; do
	if [ "$1" = "-c" ]; then c=1
	elif [ "$1" = "-d" ]; then d=1
	elif [ "$1" = "-t" ]; then tn="$2"; t=$((tn - 1)); ts="-t$tn"; shift
	elif [ -z "$f" ]; then f="$1"
	fi
	shift
done
[ -z "$f" ] && exit 0
if [ -z "${tn:-}" ]; then t=0; ts=; fi
n="$(basename "$f")"
n="${n%.*}"
e="$(ffprobe -v error -select_streams a:$t -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$f" || true)"
case "$e" in
	opus) x=".opus";;
	aac) x=".m4a";;
	mp3) x=".mp3";;
	vorbis) x=".ogg";;
	ac3) x=".ac3";;
	flac) x=".flac";;
	wmav1|wmav2|wmapro|wmalossless) x=".wma";;
	pcm_*) x=".wav";;
	dts) x=".dts";;
	eac3) x=".eac3";;
	alac) x=".m4a";;
	truehd) x=".thd";;
	amrnb) x=".amr";;
	amrwb) x=".awb";;
	smaf) x=".mmf";;
	cook) x=".ra";;
	atrac3) x=".at3";;
	sipr) x=".ra";;
	qcelp) x=".qcp";;
	mp2) x=".mp2";;
	*) x=;;
esac
[ -z "$x" ] && exit 0
[ -e "$n$ts$x" ] && exit 0
if [ -z "$c" ]; then
	ffmpeg -i "$f" -map a:$t -vn -c:a copy "$n$ts$x"
else
	ffmpeg -i "$f" -map a:$t -vn -c:a copy -map_metadata -1 -map_chapters -1 -metadata:s handler_name= -metadata:s vendor_id= -disposition 0 "$n$ts$x"
fi
[ -n "$d" ] && rm -f "$f"