Newest 'ffmpeg' Questions - Stack Overflow

http://stackoverflow.com/questions/tagged/ffmpeg

Les articles publiés sur le site

  • FFMEG option scale=-1 and scale=-2

    15 avril, par smal

    I tried to convert a video and resize it with scale=-1:720, but got the error "width not divisible by 2". And I solved it with: scale=-2:720. What are the differences between

    scale=-1:720
    

    and

    scale=-2:720
    
  • Is there a way to batch split a file by chapter with ffmpeg and then reassemble with mkvmerge in windows ?

    13 avril, par Sipherdrakon

    So I made a batch script originally with the ability to relatively precision trim a video into chapters without having to run by keyframes, but the code looks horrible and I can't get it to loop through all mp4 files nor get mkvmerge to append the files after splitting them. Code is below but be gentle it is my first try.

    @echo off
    setlocal enableDelayedExpansion
    
    REM CODE BELOW CREATES JSON FILES FOR ALL MP4 FILES WITHIN THE SAME DIRECTORY
    ffprobe -v quiet -print_format json -show_chapters -loglevel error "01x01.mp4" > "01x01.json"
    
    REM CODE BELOW SETS VARIABLES FROM EACH SPECIFIC JSON
    FOR /F "delims=" %%i in ('jq .chapters[2].start ^< 01x01.json') DO SET /A start1=%%i
    FOR /F "delims=" %%j in ('jq .chapters[2].end ^< 01x01.json') DO SET /A end1=%%j
    
    FOR /F "delims=" %%k in ('jq .chapters[4].start ^< 01x01.json') DO SET /A start2=%%k
    FOR /F "delims=" %%l in ('jq .chapters[4].end ^< 01x01.json') DO SET /A end2=%%l
    
    FOR /F "delims=" %%m in ('jq .chapters[6].start ^< 01x01.json') DO SET /A start3=%%m
    FOR /F "delims=" %%n in ('jq .chapters[6].end ^< 01x01.json') DO SET /A end3=%%n
    
    FOR /F "delims=" %%o in ('jq .chapters[8].start ^< 01x01.json') DO SET /A start4=%%o
    FOR /F "delims=" %%p in ('jq .chapters[8].end ^< 01x01.json') DO SET /A end4=%%p
    
    REM SETS THE DURATION OF EACH FILE TO USE PRECISION TIMING FOR START AND STOP TIMES
    CALL vbs (%end1%-%start1%)/1000
    SET duration1=%val%
    CALL vbs (%end2%-%start2%)/1000
    SET duration2=%val%
    CALL vbs (%end3%-%start3%)/1000
    SET duration3=%val%
    CALL vbs (%end4%-%start4%)/1000
    SET duration4=%val%
    
    REM SETS THE START TIME IN SECONDS VS MILLISECONDS
    CALL vbs (%start1%)/1000
    SET start1=%val%
    CALL vbs (%start2%)/1000
    SET start2=%val%
    CALL vbs (%start3%)/1000
    SET start3=%val%
    CALL vbs (%start4%)/1000
    SET start4=%val%
    
    REM TRIM AND SPLIT ORIGINAL FILE INTO SEPERATE SECTIONS BASED ON CHAPTER MARKERS
    ffmpeg -ss %START1% -i 01x01.mp4 -ss 0 -c copy -to %DURATION1% -avoid_negative_ts make_zero 01x01-1.mp4
    ffmpeg -ss %START2% -i 01x01.mp4 -ss 0 -c copy -to %DURATION2% -avoid_negative_ts make_zero 01x01-2.mp4
    ffmpeg -ss %START3% -i 01x01.mp4 -ss 0 -c copy -to %DURATION3% -avoid_negative_ts make_zero 01x01-3.mp4
    ffmpeg -ss %START4% -i 01x01.mp4 -ss 0 -c copy -to %DURATION4% -avoid_negative_ts make_zero 01x01-4.mp4
    
    REM DELETES UNNEEDED JSON AFTER USE
    del /s *.json
    
    REM APPEND ALL MP4 FILES INTO COHESIVE MKV
    for /d /r %%D in (*) do (
        pushd %%D
        set files=
        for %%F in (*.mp4) do set files=!files! + ^( "%%F" ^)
        if not "!files!"=="" %mkvmerge% -o "01x01-FINAL.mkv" !files:~2!
        popd
    )
    
    REM DELETE UNNEEDED MP4 ORIGINALS AND SPLIT FILES
    del /s *.mp4
    

    I know it is super long and every time I try to use a variable or a loop to run through all files it can't read the json file. I've been at this all day and I can use the script as is but I have to make a file for each iteration.

    I was also hoping to be able to have it only pull chapters labeled as "video" but I haven't quite figured that one out yet.

    I'll add the vbs batch file for the arithmetic section as well as the sample json if it will help.

    @echo off
    >"%temp%\VBS.vbs" echo Set fso = CreateObject("Scripting.FileSystemObject") : Wscript.echo (%*)
    for /f "delims=" %%a in ('cscript /nologo "%temp%\VBS.vbs"') do set "val=%%a"
    del "%temp%\VBS.vbs"
    
    {
        "chapters": [
            {
                "id": 0,
                "time_base": "1/1000",
                "start": 0,
                "start_time": "0.000000",
                "end": 5590,
                "end_time": "5.590000",
                "tags": {
                    "title": "Video"
                }
            },
            {
                "id": 1,
                "time_base": "1/1000",
                "start": 5590,
                "start_time": "5.590000",
                "end": 13994,
                "end_time": "13.994000",
                "tags": {
                    "title": "Advertisement"
                }
            },
            {
                "id": 2,
                "time_base": "1/1000",
                "start": 13994,
                "start_time": "13.994000",
                "end": 163964,
                "end_time": "163.964000",
                "tags": {
                    "title": "Video"
                }
            },
            {
                "id": 3,
                "time_base": "1/1000",
                "start": 163964,
                "start_time": "163.964000",
                "end": 195940,
                "end_time": "195.940000",
                "tags": {
                    "title": "Advertisement"
                }
            },
            {
                "id": 4,
                "time_base": "1/1000",
                "start": 195940,
                "start_time": "195.940000",
                "end": 547849,
                "end_time": "547.849000",
                "tags": {
                    "title": "Video"
                }
            },
            {
                "id": 5,
                "time_base": "1/1000",
                "start": 547849,
                "start_time": "547.849000",
                "end": 595850,
                "end_time": "595.850000",
                "tags": {
                    "title": "Advertisement"
                }
            },
            {
                "id": 6,
                "time_base": "1/1000",
                "start": 595850,
                "start_time": "595.850000",
                "end": 1413588,
                "end_time": "1413.588000",
                "tags": {
                    "title": "Video"
                }
            },
            {
                "id": 7,
                "time_base": "1/1000",
                "start": 1413588,
                "start_time": "1413.588000",
                "end": 1477569,
                "end_time": "1477.569000",
                "tags": {
                    "title": "Advertisement"
                }
            },
            {
                "id": 8,
                "time_base": "1/1000",
                "start": 1477569,
                "start_time": "1477.569000",
                "end": 1529696,
                "end_time": "1529.696000",
                "tags": {
                    "title": "Video"
                }
            }
        ]
    }
    

    I also tried using the start_time so I didn't have to do extra calculations but jq didn't like that either.

    mkvmerge doesn't even try to run when I have it in here and I still need to cut 7 seconds off the end and 12 seconds off the front of it once it is all one file again.

    Any help would be appreciated, I know it's a lot but I seem to have hit a roadblock or just sleep deprived at this point.

    UPDATE

    This works amazing I just need to figure out how to use files with spaces and I'm all set. I guess I could run a batch before hand replacing all spaces with underscores. That would probably work but I would like to not change filenames if I can help it.

    @echo off
    
    for %%i in (*.mp4) do (
    FOR /F "delims=" %%A IN ('ffprobe -v quiet -print_format json -show_chapters -loglevel error "%%i" ^| xidel - -se "$json/(chapters)()[id!=0 and tags/title='Video']/concat('ffmpeg -ss ',start div 1000,' -i %%i -to ',((end - start) div 1000),' -c copy -avoid_negative_ts make_zero %%~ni-',position(),'.mp4')"') DO %%A
    FOR /F "delims=" %%A IN ('xidel -s --xquery "concat('mkvmerge -o &quot;%%~ni-FINAL.mkv&quot; &quot;',join(file:list(.,false(),'%%~ni-*.mp4'),'&quot; + &quot;'),'&quot;')"') DO %%A
    )
    
  • Passing two named pipes as input to ffmpeg using python

    13 avril, par Kikto

    I have two av streams, one video and one audio, i'm trying to pipe both as inputs to ffmpeg

    os.mkfifo(VIDEO_PIPE_NAME)
    os.mkfifo(AUDIO_PIPE_NAME)
    
    ffmpeg_process = subprocess.Popen([    "ffmpeg", "-i", VIDEO_PIPE_NAME, "-i", AUDIO_PIPE_NAME,
     "-listen", "1", "-c:v", "copy", "-c:a", "copy", "-f", "mp4", "-movflags", 
    "frag_keyframe+empty_moov", "http://0.0.0.0:8081"], stdin=subprocess.PIPE)
    
    pipe_video = open(VIDEO_PIPE_NAME,'wb')
    pipe_audio = open(AUDIO_PIPE_NAME,'wb') #Code stuck here
    

    The code stuck on pipe_audio = open(AUDIO_PIPE_NAME,'wb') line, I'm guessing it is happening because ffmpeg only reads the first/video input and ignore the second/audio input so the pipe is not being read.

    If I use only pipe_video and removing -i AUDIO_PIPE_NAME flag from ffmpeg everything works fine, but i only get the video without the audio.

  • ffmpeg using zoompan and depan over a static image and a specific background [closed]

    13 avril, par marcorocco

    I would like use ffmpeg zoompan on a photo with this conditional

    1. duration should be about 8 seconds

    2. image should be scaled to avoid jiggly artifacts

    3. should be freezze for some seconds, and depan

    4. I already have my background: reference image is portrait

    5. I would like use a sort of "pad" during transition

    6. video out should be 1920x1080 16:9

    7. zoompan on the center

    How I can do? thanks

  • FFmpeg pan filter error when routing stereo audio to rear channels of 5.1 output

    13 avril, par MilkyTech

    I'm trying to mix a stereo commentary track into the rear surround channels of a 5.1 audio stream using FFmpeg on Windows 10. My goal is to lower the volume of the original 5.1 movie audio, then add the stereo commentary so it plays from the rear left and right speakers (SL and SR).

    I've already converted the commentary to EAC3 to match the main track's codec:

    ffmpeg -i "CastCommentary.m4a" -c:a eac3 -b:a 640k CastCommentary.eac3

    Then I tried mixing them like this (from within Command Prompt, not PowerShell or a batch file):

    ffmpeg -i "Tropic.Thunder.2008.UNRATED.mkv" -i "CastCommentary.eac3" -filter_complex "[0:a:0]volume=0.4[aud1]; [1:a:0]pan=5.1:FL=0:FR=0:FC=0:LFE=0:SL=c0:SR=c1[cm_rear]; [aud1][cm_rear]amix=inputs=2[aout]" -map 0:v -map "[aout]" -map 0:s? -t 600 -c:v copy -c:s copy -c:a eac3 -b:a 640k "Tropic.Thunder.5.1.commentary.test.mkv"
    

    But I keep getting errors like:

    [fc#0 @ ...] Error applying option 'SL' to filter 'pan': Option not found
    Error : Option not found
    

    Or:

    [Parsed_pan_1 @ ...] Expected in channel name, got ""
    

    Or even:

    Output channel layout 5.1 does not match the number of channels mapped 2.
    

    I’ve tried variations of the pan syntax:

    • pan=5.1:FL=0:FR=0:FC=0:LFE=0:SL=c0:SR=c1
    • pan=5.1|FL=0|FR=0|FC=0|LFE=0|SL=c0|SR=c1
    • Wrapping in single/double
    • quotes Escaping for CMD (no caret issues in current runs)

    Nothing seems to work.

    🎯 Goal:

    • Keep 5.1 audio from the original movie (volume lowered)
    • Add stereo commentary to SL and SR
    • Output a proper 5.1 EAC3 mix

    🔧 System:

    • Windows 10
    • FFmpeg version: [latest static build from ffmpeg.org]
    • Running in true Command Prompt (not PowerShell)
    • Source audio: 5.1 EAC3 from a .mkv, stereo .eac3 from .m4a

    What’s the correct filter_complex syntax to route a stereo track to the rear channels of a 5.1 layout using FFmpeg on Windows? Am I missing something about pan, amix, or Windows quirks?