VideoHelp Forum




+ Reply to Thread
Page 1 of 2
1 2 LastLast
Results 1 to 30 of 46
  1. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    I can get number of audio streams and number of "All" streams but cannot output the number of video streams.

    I use this ...

    REM Get the number of "All" and "audio" streams. Video stream is calculated from those two. i.e. Video = All - Audio.

    for /F "delims=" %%I in ('ffprobe -v error -show_entries format^=nb_streams -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_ALL_STREAMS=%%I"

    for /F "delims=" %%I in ('ffprobe -v error -select_streams a -show_entries stream^=index -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_AUDIO_STREAMS=%%I"

    REM for /F "delims=" %%I in ('ffprobe -v error -select_streams v -show_entries stream^=index -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_VIDEO_STREAMS=%%I"

    It always returns 0 for video streams.
    Quote Quote  
  2. Try posting here:
    ffmpeg

    Originally Posted by JN- View Post
    I can get number of audio streams and number of "All" streams but cannot output the number of video streams.

    I use this ...

    REM Get the number of "All" and "audio" streams. Video stream is calculated from those two. i.e. Video = All - Audio.

    for /F "delims=" %%I in ('ffprobe -v error -show_entries format^=nb_streams -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_ALL_STREAMS=%%I"

    for /F "delims=" %%I in ('ffprobe -v error -select_streams a -show_entries stream^=index -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_AUDIO_STREAMS=%%I"

    REM for /F "delims=" %%I in ('ffprobe -v error -select_streams v -show_entries stream^=index -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_VIDEO_STREAMS=%%I"

    It always returns 0 for video streams.
    As always .. there is nothing wrong with my environment
    Quote Quote  
  3. Ffmpeg -i inputvideo
    will show you all streams.
    Quote Quote  
  4. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Sure, thanks. That command returns the following ...

    ffmpeg version 2024-11-25-git-04ce01df0b-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
    built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
    configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
    libavutil 59. 47.101 / 59. 47.101
    libavcodec 61. 25.103 / 61. 25.103
    libavformat 61. 9.100 / 61. 9.100
    libavdevice 61. 4.100 / 61. 4.100
    libavfilter 10. 6.101 / 10. 6.101
    libswscale 8. 12.100 / 8. 12.100
    libswresample 5. 4.100 / 5. 4.100
    libpostproc 58. 4.100 / 58. 4.100
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '4s.mov':
    Metadata:
    major_brand : qt
    minor_version : 512
    compatible_brands: qt
    date : 2013-07-21T13:55:57+0100
    date-eng : 2013-07-21T13:55:57+0100
    encoder : Lavf58.48.100
    make : Apple
    make-eng : Apple
    model : iPhone 5
    model-eng : iPhone 5
    Duration: 00:00:04.02, start: 0.000000, bitrate: 17919 kb/s
    Stream #0:0[0x1]: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 17906 kb/s, 29.98 fps, 29.97 tbr, 19200 tbn (default)
    Metadata:
    handler_name : Core Media Video
    vendor_id : FFMP
    encoder : H.264
    Stream #0:1[0x2]: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, mono, fltp, 63 kb/s (default)
    Metadata:
    handler_name : Core Media Audio
    vendor_id : [0][0][0][0]
    Stream mapping:
    Stream #0:0 -> #0:0 (h264 (native) -> wrapped_avframe (native))
    Stream #0:1 -> #0:1 (aac (native) -> pcm_s16le (native))
    Press [q] to stop, [?] for help
    Output #0, null, to 'pipe:':
    Metadata:
    major_brand : qt
    minor_version : 512
    compatible_brands: qt
    date : 2013-07-21T13:55:57+0100
    date-eng : 2013-07-21T13:55:57+0100
    model-eng : iPhone 5
    make : Apple
    make-eng : Apple
    model : iPhone 5
    encoder : Lavf61.9.100
    Stream #0:0: Video: wrapped_avframe, yuv420p(tv, bt709, progressive), 1920x1080, q=2-31, 200 kb/s, 29.97 fps, 29.97 tbn (default)
    Metadata:
    encoder : Lavc61.25.103 wrapped_avframe
    handler_name : Core Media Video
    vendor_id : FFMP
    Stream #0:1: Audio: pcm_s16le, 44100 Hz, mono, s16, 705 kb/s (default)
    Metadata:
    encoder : Lavc61.25.103 pcm_s16le
    handler_name : Core Media Audio
    vendor_id : [0][0][0][0]
    [out#0/null @ 00000286b86aa340] video:52KiB audio:346KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
    frame= 120 fps=0.0 q=-0.0 Lsize=N/A time=00:00:04.00 bitrate=N/A speed=27.9x
    Quote Quote  
  5. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    I was thinking in terms of returning a single value such as 0 or 1 or 2 etc as per my "ALL" and "Audio" syntax.
    Quote Quote  
  6. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    "Try posting here:
    ffmpeg"

    Thanks. I did think of that but figured I might get more response here. In future if I have a ffmpeg/ffprobe query I will do that. I'm sure double posting is not allowed.
    Quote Quote  
  7. Ffmpeg gave you your info
    Stream #0:0 video
    Stream #0:1 audio
    Quote Quote  
  8. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Ok. I was hoping someone might see why my third ffprobe syntax for video doesn't return anything besides 0.
    Quote Quote  
  9. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    OK. I see some of the errors. The 1st. of the 3 syntax returns the number of all streams, Audio, Video etc.

    The 2nd. and 3rd. syntax lines actually are returning the "index", not the count of any audio and video streams.

    So my question needs to be restated: How can I modify the 2nd. and 3rd. syntax lines to return the count of audio/video streams.

    This was my starting point … https://superuser.com/questions/1381642/ffprobe-count-video-and-audio-streams-tracks
    Quote Quote  
  10. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    According to the link above the "count" of items other than "ALL" may not be available. So it's a case of using the index values to establish it.
    Quote Quote  
  11. simple. pipe output to grep -c

    ........ | grep -c "Video"

    ........ | grep -c "Audio"
    Quote Quote  
  12. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    I think grep is Linux? I am only using Windows.
    Quote Quote  
  13. I think grep is Linux? I am only using Windows.

    Google grep for windows ... cygwin64
    Quote Quote  
  14. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    https://stackoverflow.com/questions/1416241/is-there-a-pattern-matching-utility-like-grep-in-windows

    "Thanks! It's not grep, but I like to be able to function without installing additional software on other people's machines and this will let me."

    If Findstr could do it then good. It's built in. Like the above quote from link I don't wish to use non-windows utils. Thanks.
    Quote Quote  
  15. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Originally Posted by ProWo View Post
    Ffmpeg gave you your info
    Stream #0:0 video
    Stream #0:1 audio
    I'm pretty sure that thats only the video and audio indexes, not the count of video, audio streams.

    For sure the streams count can then be found from the indexes, with a few fixed assumptions.
    Quote Quote  
  16. I don't wish to use non-windows utils
    Interesting. You must have the the only version of windows which has ffprobe built in.
    Quote Quote  
  17. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Fair point. I should have been more specific, clearer. With the exception of using the ffmpeg utils in my batch files I prefer to only use the Windows utils.

    That way if I pass on my batch files to anyone else they will work as is, but clear instructions for locating the ffmpeg utils and adding to the PATH are included in the readme/Help.
    Quote Quote  
  18. Member
    Join Date
    Apr 2007
    Location
    Australia
    Search Comp PM
    Code:
    @echo off
    setlocal EnableDelayedExpansion
    
    for %%a in ("*.mkv") do (
        ffmpeg -i "%%a" -y nul 2>&1 | find /c "Video:" > count.txt
        set /p count= < count.txt
        echo Video count for "%%a" is: !count!
        del count.txt
    )
    pause
    Quote Quote  
  19. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    @pcspeak

    Truly excellent. Works for audio also. Thank you.
    Quote Quote  
  20. Member
    Join Date
    Apr 2007
    Location
    Australia
    Search Comp PM
    Enhancement!
    Write output to Video-List.txt. Skip if only one video in the mkv.

    Code:
    @echo off
    setlocal EnableDelayedExpansion
    
    if exist Video-List.txt del Video-List.txt
    for %%a in ("*.mkv") do (
        ffmpeg -i "%%a" -y nul 2>&1 | find /c "Video:" > count.txt
        set /p count= < count.txt
        if !count! gtr 1 echo Video count for "%%a" is: !count! >> Video-List.txt
        del count.txt
    )
    pause
    Quote Quote  
  21. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Thanks.

    I tried doing a drag and drop of a single file using this but it returns 0 video, any ideas ?

    @echo off
    mode CON:cols=228 lines=30
    color 0A
    SETLOCAL EnableDelayedExpansion

    SET _INPUT_FILE=%~n1%~x1
    SET _INPUT_FILENAME=%~n1
    SET _INPUT_EXTN=%~x1

    for %%a in ("%_INPUT_FILE%") do (
    ffmpeg -i "%%a" -y nul 2>&1 | find /c "Video:">count.txt
    set /p count=<count.txt
    echo Video count for "%%a" is: !count!
    echo "%%a" !count!>>Count-of-video-streams.txt
    REM del count.txt
    )

    pause
    exit
    Quote Quote  
  22. Member
    Join Date
    Apr 2007
    Location
    Australia
    Search Comp PM
    It's NOT drag and drop.
    All the mkv files in the folder the batch file is run from are processed.
    Quote Quote  
  23. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    If I remove all spaces in input file it works.

    I would have thought that the "%_INPUT_FILE%" would take care of that.
    Quote Quote  
  24. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Originally Posted by pcspeak View Post
    It's NOT drag and drop.
    All the mkv files in the folder the batch file is run from are processed.
    Appreciated. I would like to use drag and drop to process a single file only, as well as your all .mkv etc.
    Quote Quote  
  25. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Got it, have it now for single plus multiple, happy days. many thanks pcspeak

    @echo off
    mode CON:cols=228 lines=30
    color 0A
    SETLOCAL EnableDelayedExpansion

    REM If SET _INPUT_FILE="%~n1%~x1" is used then all program code references to input file should be so ... %_INPUT_FILE%. File will display as "My File.mp4"
    REM If SET _INPUT_FILE=%~n1%~x1 is used then all program code references to input file should be so ... "%_INPUT_FILE%". File will display as My File.mp4
    REM If SET "_INPUT_FILE=%~n1%~x1" is used then all program code references to input file should be so ... "%_INPUT_FILE%". File will display as My File.mp4

    SET _INPUT_FILE="%~n1%~x1"
    SET _INPUT_FILENAME=%~n1
    SET _INPUT_EXTN=%~x1

    ffmpeg -i %_INPUT_FILE% -y nul 2>&1 | find /c "Video:">count.txt
    set /p count=<count.txt
    echo Video count for %_INPUT_FILE% is: !count!
    echo %_INPUT_FILE% !count!>>Count-of-video-streams.txt
    del count.txt

    pause
    exit
    Quote Quote  
  26. he issue you're facing is due to how you're using ffprobe with the -select_streams v option. Unlike -select_streams a, which lists audio streams, -select_streams v filters video streams but doesn't directly provide a count unless used with specific entries or techniques.

    Here’s how you can correctly calculate the number of video streams:

    Corrected Approach
    Use ffprobe to count the total streams (nb_streams).
    Use -select_streams a to count audio streams.
    Use -select_streams v to count video streams directly.
    Here’s an updated script:
    REM Get the total number of streams (all types)
    for /F "delims=" %%I in ('ffprobe -v error -show_entries format^=nb_streams -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_ALL_STREAMS=%%I"

    REM Get the number of audio streams
    for /F "delims=" %%I in ('ffprobe -v error -select_streams a -show_entries stream^=index -of csv=p^=0 -of csv^=s^=, "%_INPUT_FILE%" 2^>^&1 ^| find /C ","') do set "_NUM_OF_AUDIO_STREAMS=%%I"

    REM Get the number of video streams
    for /F "delims=" %%I in ('ffprobe -v error -select_streams v -show_entries stream^=index -of csv=p^=0 -of csv^=s^=, "%_INPUT_FILE%" 2^>^&1 ^| find /C ","') do set "_NUM_OF_VIDEO_STREAMS=%%I"

    REM Debug output
    echo Total Streams: %_NUM_OF_ALL_STREAMS%
    echo Audio Streams: %_NUM_OF_AUDIO_STREAMS%
    echo Video Streams: %_NUM_OF_VIDEO_STREAMS%
    Quote Quote  
  27. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Impressive indeed. I'd never have got there. Thanks.

    However. It doesn't return the correct number of video streams in a test file with 2 video streams. It returns only a value of 1.

    In case an error has crept in on my part this is what I used.

    REM Get the total number of streams (all types)
    for /F "delims=" %%I in ('ffprobe -v error -show_entries format^=nb_streams -of default^=noprint_wrappers^=1:nokey^=1 "%_INPUT_FILE%" 2^>^&1') do set "_NUM_OF_ALL_STREAMS=%%I"
    REM Get the number of audio streams
    for /F "delims=" %%I in ('ffprobe -v error -select_streams a -show_entries stream^=index -of csv=p^=0 -of csv^=s^=, "%_INPUT_FILE%" 2^>^&1 ^| find /C ","') do set "_NUM_OF_AUDIO_STREAMS=%%I"
    REM Get the number of video streams
    for /F "delims=" %%I in ('ffprobe -v error -select_streams v -show_entries stream^=index -of csv=p^=0 -of csv^=s^=, "%_INPUT_FILE%" 2^>^&1 ^| find /C ","') do set "_NUM_OF_VIDEO_STREAMS=%%I"

    REM Debug output
    echo Total Streams: %_NUM_OF_ALL_STREAMS%
    echo Audio Streams: %_NUM_OF_AUDIO_STREAMS%
    echo Video Streams: %_NUM_OF_VIDEO_STREAMS%
    pause
    exit
    Last edited by JN-; 11th Dec 2024 at 04:54.
    Quote Quote  
  28. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    This is a sample file with 2 video streams. https://www.dropbox.com/scl/fo/jm62of70hdlgogwab0c4l/AIkVHEseqimENB4vOn-CaCg?rlkey=2so...xbz8bumz7&dl=0

    Perhaps your code is only returning the video index? But thats unlikely as with a single video stream it returns 1 not 0.
    Last edited by JN-; 11th Dec 2024 at 04:55.
    Quote Quote  
  29. Member
    Join Date
    Apr 2007
    Location
    Australia
    Search Comp PM
    I had a think overnight.
    Not tested thoroughly. Put the batch file in with a bunch of mkv videos, run it and see what you get.


    stream-count.cmd
    Code:
    @echo off
     setlocal EnableDelayedExpansion
    
    if exist Video-List.txt del Video-List.txt
    for %%a in ("*.mkv") do (
        for %%b in (Video: Audio: Subtitle:) do (
        ffmpeg -i "%%a" -y nul 2>&1 | find /c "%%b" > count.txt
        set /p count= < count.txt
        if %%b equ Video: (echo "%%a" >> Video-List.txt && echo %%b !count! >> Video-List.txt
            ) else (
            echo %%b !count! >> Video-List.txt
            set count=
            )
        )
        echo. >> Video-List.txt
    )
    start "" /I Video-List.txt
    Cheers.
    Quote Quote  
  30. Member
    Join Date
    Jun 2022
    Location
    Dublin
    Search Comp PM
    Definitely works as far as I can see. Tested on:

    A "Pretend" empty video file
    A video file with subtitles
    A video file with one or multiple audio
    A video file with audio, no video
    A video file with 2 video streams
    All above .mp4.

    A video file with video, no audio, .asf.

    Typical output:

    "#PRETEND video file.mp4"
    Video: 0
    Audio: 0
    Subtitle: 0

    "01 - Dancing Queen.mp4"
    Video: 0
    Audio: 1
    Subtitle: 0

    "2-video-streams.MP4"
    Video: 2
    Audio: 1
    Subtitle: 0

    "Conv #Has 12 audio streams.mp4"
    Video: 1
    Audio: 12
    Subtitle: 0

    "DJI_0033, two video streams, one audio,.MP4"
    Video: 2
    Audio: 1
    Subtitle: 0

    "No Audio, 1 video only, - Original, DJI_0796_000.MP4"
    Video: 1
    Audio: 0
    Subtitle: 0

    "Subtitles.mp4"
    Video: 1
    Audio: 2
    Subtitle: 1

    "z-2-video-streams.MP4"
    Video: 2
    Audio: 1
    Subtitle: 0
    Last edited by JN-; 11th Dec 2024 at 15:48.
    Quote Quote  



Similar Threads

Visit our sponsor! Try DVDFab and backup Blu-rays!