#!/usr/bin/env bash get_av_format() { # Desc: Gets audio/video format of file as string # Usage: get_av_format arg1 # Depends: ffprobe # Version: 0.0.1 # Input: arg1: input file path # Output: stdout (if valid audio or video format) # exit code 0 if av file; 1 otherwise # Example: get_av_format myvideo.mp4 # Note: Would return "opus" if full ffprobe report had 'Audio: opus, 48000 Hz, stereo, fltp' # Note: Not tested with videos containing multiple video streams # Ref/Attrib: [1] https://stackoverflow.com/questions/5618363/is-there-a-way-to-use-ffmpeg-to-determine-the-encoding-of-a-file-before-transcod # [2] https://stackoverflow.com/questions/44123532/how-to-find-out-the-file-extension-for-extracting-audio-tracks-with-ffmpeg-and-p#comment88464070_50723126 # TODO 2022-08-19: output path of validated file to stdout for gnu parallel use local av_format file_in; local return_state; file_in="$1"; # Return error exit code if not audio file ## Return error if ffprobe itself exited on error if ! ffprobe -v error -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 "$file_in" 1>/dev/null 2>&1; then return_state="false"; fi; # Get av format av_format="$(ffprobe -v error -select_streams a -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 "$file_in")"; # see [1] ## Return error if audio av is incorrectly formatted (e.g. reject if contains spaces) pattern="^[[:alnum:]]+$"; # alphanumeric string with no spaces if [[ $av_format =~ $pattern ]]; then return_state="true"; # Report audio format echo "$av_format"; else return_state="false"; fi; # Report exit code if [[ $return_state = "true" ]]; then return 0; # echo "$1" #TODO_______________ else return 1; fi; } # Get audio format as stdout # Author: Steven Baltakatei Sandoval # License: GPLv3+