'Is there a way to use ffmpeg to determine the encoding of a file before transcoding?
I am planning to use ffmpeg to ensure all video files uploaded to my website are encoded as mp4 h264.
Rather than automatically processing every file I would like to minimise the processing overhead by only processing those files that are not already mp4 h264. Is there an easy way to do this either with ffmpeg or with another command line utility?
Solution 1:[1]
Use ffprobe
Example command
$ ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=nokey=1:noprint_wrappers=1 input.mp4
Result
h264
Option descriptions
-v errorOmit extra information except for fatal errors.-select_streams v:0Select only the first video stream. Otherwise thecodec_namefor all other streams in the file, such as audio, will be shown as well.-show_entries stream=codec_nameOnly output thecodec_nameinstead of all stream info.-of default=nokey=1:noprint_wrappers=1Select the default output format style and omit the key and wrapper info. Otherwise, without these options, it will output:[STREAM] codec_name=h264 [/STREAM]
Also see
Bash script example
Only re-encode if video is not H.264:
#!/bin/bash
mkdir h264vids
for f in *.mkv
do
audioformat=$(ffprobe -loglevel error -select_streams v:0 -show_entries stream=codec_name -of default=nw=1:nk=1 "$f")
if [ "$audioformat" = "h264" ]; then
ffmpeg -i "$f" -c:v copy -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
else
ffmpeg -i "$f" -c:v libx264 -c:a aac -movflags +faststart h264vids/"${f%.*}.mp4"
fi
done
This is a simple script and will ignore additional video streams if you input has more than one.
Solution 2:[2]
An alternative is to use ffprobe which is included with ffmpeg. The following will give the most terse output I can find from the ffmpeg tools:
ffprobe -hide_banner -stats -i myfile.avi
Solution 3:[3]
As llogan said above, let me simplify it for other new leaners?video265.mp4 is your video file:
ffprobe -v error -show_entries stream=codec_name video265.mp4
Result:
[STREAM]
codec_name=hevc
[/STREAM]
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Timothy C. Quinn |
| Solution 3 | Chinese Cat |
