Generating DASH manifest with ffmpeg works in Docker exec shell but not in os.exec golang

104 Views Asked by At

I am trying to generate a DASH manifest with ffmpeg using this command

/usr/bin/ffmpeg -f webm_dash_manifest -i ./480.webm -f webm_dash_manifest -i ./audio.webm -c copy -map 0:0 -map 1:0 -y -f webm_dash_manifest -adaptation_sets "id=0,streams=0 id=1,streams=1" ./manifest.mpd -loglevel repeat+level+verbose

I run this in go, in a docker container as shown:

func runFFmpeg(arguments []string) {
    arguments = append(arguments, "-loglevel", "repeat+level+verbose")
    cmd := exec.Command("ffmpeg", arguments...)

    fmt.Printf("cmd: %v\n", cmd)

    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    err := cmd.Run()

    if err != nil {
        log.Println(err)
        log.Println(stderr.String())
    }
}
runFFmpeg([]string{"-f", "webm_dash_manifest", "-i", "./480.webm", "-f", "webm_dash_manifest", "-i", "./audio.webm", "-c", "copy", "-map", "0:0", "-map", "1:0", "-y", "-f", "webm_dash_manifest", "-adaptation_sets", "\"id=0,streams=0 id=1,streams=1\"", "./manifest.mpd"})

But I get this output:

 cmd: /usr/bin/ffmpeg -f webm_dash_manifest -i ./480.webm -f webm_dash_manifest -i ./audio.webm -c copy -map 0:0 -map 1:0 -y -copy_unknown -f webm_dash_manifest -adaptation_sets "id=0,streams=0 id=1,streams=1" ./manifest.mpd -loglevel repeat+level+verbose
 2023/02/22 04:45:17 exit status 1
 2023/02/22 04:45:17 [info] ffmpeg version 5.1.2 Copyright (c) 2000-2022 the FFmpeg developers
 [info]   built with gcc 12.2.1 (Alpine 12.2.1_git20220924-r3) 20220924
 [info]   configuration: --prefix=/usr --enable-avfilter --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gnutls --enable-gpl --enable-libass --enable-libmp3lame --enable-libpulse --enable-libvorbis --enable-libvpx --enable-libxvid --enable-libx264 --enable-libx265 --enable-libtheora --enable-libv4l2 --enable-libdav1d --enable-lto --enable-postproc --enable-pic --enable-pthreads --enable-shared --enable-libxcb --enable-librist --enable-libsrt --enable-libssh --enable-libvidstab --disable-stripping --disable-static --disable-librtmp --disable-lzma --enable-libaom --enable-libopus --enable-libsoxr --enable-libwebp --enable-vaapi --enable-vdpau --enable-vulkan --enable-libdrm --enable-libzmq --optflags=-O2 --disable-debug --enable-libsvtav1
 [info]   libavutil      57. 28.100 / 57. 28.100
 [info]   libavcodec     59. 37.100 / 59. 37.100
 [info]   libavformat    59. 27.100 / 59. 27.100
 [info]   libavdevice    59.  7.100 / 59.  7.100
 [info]   libavfilter     8. 44.100 /  8. 44.100
 [info]   libswscale      6.  7.100 /  6.  7.100
 [info]   libswresample   4.  7.100 /  4.  7.100
 [info]   libpostproc    56.  6.100 / 56.  6.100
 [webm_dash_manifest @ 0x7fcec2836100] [warning] Could not find codec parameters for stream 0 (Video: vp9, 1 reference frame, none(tv, progressive, left), 640x480): unspecified pixel format
 Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
 [info] Input #0, webm_dash_manifest, from './480.webm':
 [info]   Metadata:
 [info]     title           : Big Buck Bunny, Sunflower version
 [info]     GENRE           : Animation
 [info]     MAJOR_BRAND     : isom
 [info]     MINOR_VERSION   : 1
 [info]     COMPATIBLE_BRANDS: isomavc1
 [info]     COMPOSER        : Sacha Goedegebure
 [info]     ARTIST          : Blender Foundation 2008, Janus Bager Kristensen 2013
 [info]     COMMENT         : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
 [info]     ENCODER         : Lavf59.27.100
 [info]   Duration: 00:10:34.60, bitrate: 352 kb/s
 [info]   Stream #0:0: Video: vp9, 1 reference frame, none(tv, progressive, left), 640x480, SAR 853:640 DAR 853:480, 30 fps, 30 tbr, 1k tbn (default)
 [info]     Metadata:
 [info]       HANDLER_NAME    : GPAC ISO Video Handler
 [info]       VENDOR_ID       : [0][0][0][0]
 [info]       ENCODER         : Lavc59.37.100 libvpx-vp9
 [info]       DURATION        : 00:10:34.600000000
 [info]       webm_dash_manifest_duration: 634600
 [info]       webm_dash_manifest_initialization_range: 889
 [info]       webm_dash_manifest_file_name: 480.webm
 [info]       webm_dash_manifest_track_number: 1
 [info]       webm_dash_manifest_cues_start: 27924928
 [info]       webm_dash_manifest_cues_end: 27927508
 [info]       webm_dash_manifest_bandwidth: 738287
 [info]       webm_dash_manifest_cluster_keyframe: 1
 [info]       webm_dash_manifest_cue_timestamps: 67,5067,10067,15067,20067,25067,30067,35067,40067,45067,50067,55067,60067,65067,70067,75067,80067,85067,90067,95067,100067,105067,110067,115067,120067,125067,130067,135067,140067,145067,150067,155067,160067,165067,170067,175067,180067,185067,190067,195067
 [info] Input #1, webm_dash_manifest, from './audio.webm':
 [info]   Metadata:
 [info]     title           : Big Buck Bunny, Sunflower version
 [info]     GENRE           : Animation
 [info]     MAJOR_BRAND     : isom
 [info]     MINOR_VERSION   : 1
 [info]     COMPATIBLE_BRANDS: isomavc1
 [info]     COMPOSER        : Sacha Goedegebure
 [info]     ARTIST          : Blender Foundation 2008, Janus Bager Kristensen 2013
 [info]     COMMENT         : Creative Commons Attribution 3.0 - http://bbb3d.renderfarming.net
 [info]     ENCODER         : Lavf59.27.100
 [info]   Duration: 00:05:35.91, bitrate: 120 kb/s
 [info]   Stream #1:0: Audio: vorbis, 48000 Hz, 5.1, fltp (default)
 [info]     Metadata:
 [info]       HANDLER_NAME    : GPAC ISO Audio Handler
 [info]       VENDOR_ID       : [0][0][0][0]
 [info]       ENCODER         : Lavc59.37.100 libvorbis
 [info]       DURATION        : 00:05:35.907000000
 [info]       webm_dash_manifest_duration: 335907
 [info]       webm_dash_manifest_initialization_range: 7411
 [info]       webm_dash_manifest_file_name: audio.webm
 [info]       webm_dash_manifest_track_number: 1
 [info]       webm_dash_manifest_cues_start: 5047497
 [info]       webm_dash_manifest_cues_end: 5048846
 [info]       webm_dash_manifest_bandwidth: 126994
 [info]       webm_dash_manifest_cluster_keyframe: 1
 [info]       webm_dash_manifest_cue_timestamps: 0,4986,9980,14962,19959,24956,29946,34930,39916,44911,49908,54892,59874,64868,69858,74858,79855,84847,89834,94834,99826,104826,109826,114818,119812,124799,129780,134770,139756,144743,149727,154719,159714,164706,169698,174687,179668,184667,189658,194650,19
 HERE'S THE ERROR --> [error] Could not write header for output file #0 (incorrect codec parameters ?): Operation not permitted
 [error] Error initializing output stream 0:1 -- 
 [info] Stream mapping:
 [info]   Stream #0:0 -> #0:0 (copy)
 [info]   Stream #1:0 -> #0:1 (copy)
 [error] 
 [AVIOContext @ 0x7fcebe23a840] [verbose] Statistics: 0 bytes written, 0 seeks, 0 writeouts
 [AVIOContext @ 0x7fcebe23a980] [verbose] Statistics: 5940786 bytes read, 133 seeks
 [AVIOContext @ 0x7fcebe23acc0] [verbose] Statistics: 2260628 bytes read, 72 seeks

It works perfectly however if I run it within docker exec (exec into the container and run the command in bash). Also, note in the last output that the command is well formed when I print it out from go. File permissions are also not the problem since the command to create the video variants works with os.exec i.e

runFFmpeg([]string{"-i", originalFilePath, "-c:v", "libvpx-vp9", "-keyint_min", "150", "-g", "150", "-tile-columns", "4", "-frame-parallel", "1", "-f", "webm", "-dash", "1", "-an", "-vf", fmt.Sprintf("scale=%s:%s", width, height), "-b:v", bitRate, "-dash", "1", "-y", destinationFilePath})
0

There are 0 best solutions below