Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot use HardwareAccelerationDevice.Auto with ffmpeg 6.1.0 #484

Open
blfuentes opened this issue Nov 20, 2023 · 1 comment
Open

Cannot use HardwareAccelerationDevice.Auto with ffmpeg 6.1.0 #484

blfuentes opened this issue Nov 20, 2023 · 1 comment

Comments

@blfuentes
Copy link

Windows 1 22h2
.net 8 8.0.100
ffmpeg 6.1.0
ffmpegcore 5.1.0

I created a command line program that I use to convert from different formats to mp3 with ffmpeg.
It was working fine in 6.0.0 but since I've updated I get the following error for some files:

FFMpegCore.Exceptions.FFMpegException: 'ffmpeg exited with non-zero exit-code (69 - ffmpeg version 6.1-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 12.2.0 (Rev10, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --pkg-config=pkgconf --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-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 
--enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libjxl 
--enable-libopenjpeg --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-ffnvcodec --enable-nvdec --enable-nvenc --enable-dxva2 
--enable-d3d11va --enable-libvpl --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-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b 
--enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, flac, from 'D:\test\04. Red Giant.flac':
  Metadata:
    ARTIST          : Hippie Death Cult
    TITLE           : Red Giant
    ALBUM           : Helichrysum
    DATE            : 2023
    album_artist    : Hippie Death Cult
    track           : 4
    TRACKTOTAL      : 7
    disc            : 1
    DISCTOTAL       : 1
  Duration: 00:04:47.67, start: 0.000000, bitrate: 910 kb/s
  Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
  Stream #0:1: Video: mjpeg (Progressive), yuvj420p(pc, bt470bg/unknown/unknown), 1400x1400 [SAR 72:72 DAR 1:1], 90k tbr, 90k tbn (attached pic)
    Metadata:
      comment         : Cover (front)
Using auto hwaccel type cuda with new default device.
Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg (native) -> png (native))
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
[mjpeg @ 0000015b83cc1b80] decoder->cvdl->cuvidDecodePicture(decoder->decoder, &ctx->pic_params) failed -> CUDA_ERROR_INVALID_IMAGE: device kernel image is invalid
[vist#0:1/mjpeg @ 0000015b83cc19c0] Error submitting packet to decoder: Generic error in an external library
[swscaler @ 0000015b8cf21c40] deprecated pixel format used, make sure you did set range correctly
[vost#0:0/png @ 0000015b838bd5c0] No filtered frames for output stream, trying to initialize anyway.
Output #0, mp3, to 'D:\test\output\Hippie Death Cult - Helichrysum\04. Red Giant.mp3':
  Metadata:
    TPE1            : Hippie Death Cult
    TIT2            : Red Giant
    TALB            : Helichrysum
    TDRC            : 2023
    TPE2            : Hippie Death Cult
    TRCK            : 4
    TRACKTOTAL      : 7
    TPOS            : 1
    DISCTOTAL       : 1
    TSSE            : Lavf60.16.100
  Stream #0:0: Video: png, rgb24(progressive), 1400x1400 [SAR 1:1 DAR 1:1], q=2-31, 200 kb/s, 90k fps, 90k tbn (attached pic)
    Metadata:
      comment         : Cover (front)
      encoder         : Lavc60.31.102 png
  Stream #0:1: Audio: mp3, 44100 Hz, stereo, s16p, 192 kb/s
    Metadata:
      encoder         : Lavc60.31.102 libmp3lame
frame=    0 fps=0.0 q=0.0 size=       0kB time=00:04:46.98 bitrate=   0.0kbits/s speed=21.2x    
[vist#0:1/mjpeg @ 0000015b83cc19c0] Decode error rate 1 exceeds maximum 0.666667
[mp3 @ 0000015b838b9d00] No packets were sent for some of the attached pictures.
[out#0/mp3 @ 0000015b838bbe00] video:0kB audio:6743kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.012484%
frame=    0 fps=0.0 q=0.0 Lsize=    6744kB time=00:04:47.66 bitrate= 192.1kbits/s speed=20.5x    
Conversion failed!)'

And this is the code I use to generate that conversion (It's F#, but I think it's easy enough to understand...)

let getConversionOutputOptions (options: FFMpegArgumentOptions) (codec: string) =
    match codec with
    | "mp3" ->  options.WithAudioBitrate(AudioQuality.Good)
                        .WithAudioCodec(AudioCodec.LibMp3Lame) |> ignore
    | "ac3" ->  options.WithAudioBitrate(AudioQuality.Good)
                        .WithAudioCodec(AudioCodec.Ac3) |> ignore
    | "ogg" ->  options.WithAudioBitrate(AudioQuality.Good)
                        .WithAudioCodec(AudioCodec.LibVorbis) |> ignore
    | "avi" -> options
                        .WithVideoCodec(VideoCodec.LibX264)
                        .WithAudioCodec(AudioCodec.LibMp3Lame)
                        .UsingMultithreading(true)
                        .UsingThreads(System.Environment.ProcessorCount)
                        .WithAudioBitrate(AudioQuality.Normal)
                        //.WithVideoBitrate(5000) // reduction of ~85%. Around 50% with 25000
                        .WithFastStart()
                        |> ignore
    | _ -> options.WithAudioBitrate(AudioQuality.Normal)
                    .WithAudioCodec(AudioCodec.LibMp3Lame) |> ignore

let getConversioInputOptions (options: FFMpegArgumentOptions) (codec: string) =
    options
        .WithHardwareAcceleration(HardwareAccelerationDevice.Auto)
        .UsingMultithreading(true)
        .UsingThreads(System.Environment.ProcessorCount)
        |> ignore

let processFile (codec: string) (outputfolder: string) (inputext: string) (file:string)=
    async {
        printfn "Processing file '%s' ..." file
        let outputFile = Path.Join([|outputfolder; (Path.GetFileName(file).Replace(inputext, codec)) |]) 
        if outputFile.EndsWith(codec) then
            let inputOptions = fun input -> getConversioInputOptions input codec
            let outputOptions = fun options -> getConversionOutputOptions options codec
            let processor = FFMpegArguments
                                .FromFileInput(file, true, inputOptions)
                                .OutputToFile(outputFile, true, outputOptions)

            processor.ProcessSynchronously() |> ignore
        else
            printfn "Skipping file '%s' as its format is not the expected." outputFile
        printfn "Processed! File saved to '%s' %s" outputFile System.Environment.NewLine
    }

If I change the line .WithHardwareAcceleration(HardwareAccelerationDevice.Auto) switching to D3D11VA for example, then I get no exception.

As I said, it was working before with the ffmpeg 6.0.0, but checking the changelog I have no idea how to adapt my code leaving the hardware acceleration to auto (or is this a bad idea?)

version 6.1:
- libaribcaption decoder
- Playdate video decoder and demuxer
- Extend VAAPI support for libva-win32 on Windows
- afireqsrc audio source filter
- arls filter
- ffmpeg CLI new option: -readrate_initial_burst
- zoneplate video source filter
- command support in the setpts and asetpts filters
- Vulkan decode hwaccel, supporting H264, HEVC and AV1
- color_vulkan filter
- bwdif_vulkan filter
- nlmeans_vulkan filter
- RivaTuner video decoder
- xfade_vulkan filter
- vMix video decoder
- Essential Video Coding parser, muxer and demuxer
- Essential Video Coding frame merge bsf
- bwdif_cuda filter
- Microsoft RLE video encoder
- Raw AC-4 muxer and demuxer
- Raw VVC bitstream parser, muxer and demuxer
- Bitstream filter for editing metadata in VVC streams
- Bitstream filter for converting VVC from MP4 to Annex B
- scale_vt filter for videotoolbox
- transpose_vt filter for videotoolbox
- support for the P_SKIP hinting to speed up libx264 encoding
- Support HEVC,VP9,AV1 codec in enhanced flv format
- apsnr and asisdr audio filters
- OSQ demuxer and decoder
- Support HEVC,VP9,AV1 codec fourcclist in enhanced rtmp protocol
- CRI USM demuxer
- ffmpeg CLI '-top' option deprecated in favor of the setfield filter
- VAAPI AV1 encoder
- ffprobe XML output schema changed to account for multiple
  variable-fields elements within the same parent element
- ffprobe -output_format option added as an alias of -of
@blfuentes
Copy link
Author

I've found, that if I add the selectstream to the output options and get the Audio one, I can use the auto in hardwareacceleration...
.SelectStream(0, 0, Channel.Audio)

Why would be this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant