gpt4 book ai didi

ffmpeg - avformat_open_input 仅在自定义 IO 上下文时失败

转载 作者:行者123 更新时间:2023-12-03 23:57:28 69 4
gpt4 key购买 nike

avformat_open_input 遇到一个奇怪的问题,它失败了:

Invalid data found when processing input



但这只发生在我尝试使用自定义 AVIOContext 读取文件时。 .

我的自定义代码如下(为清楚起见省略了错误检查):
auto fmtCtx = avformat_alloc_context();
auto ioBufferSize = 32768;
auto ioBuffer = (unsigned char *)av_malloc(ioBufferSize);
auto ioCtx = avio_alloc_context(ioBuffer,
ioBufferSize,
0,
reinterpret_cast<void *>(this),
&imageIORead,
NULL,
&imageIOSeek));

fmtCtx -> pb = ioCtx;
fmtCtx -> flags |= AVFMT_FLAG_CUSTOM_IO;

int err = avformat_open_input(&fmtCtx, NULL, NULL, NULL);
imageIOSeek从未被调用,但正确处理 whence参数包括 AVSEEK_SIZE选项。我的文件数据已经加载到内存中,所以 imageIORead是微不足道的(在 EOF 返回 0):
int imageIORead(void *opaque, uint8_t *buf, int buf_size) {
Image *d = (Image *)buf;
int rc = std::min(buf_size, static_cast<int>(d->data.size() - d->pos));

memcpy(buf, d->data.data() + d->pos, rc);
d->pos += rc;
return rc;
}

正在读取的数据是从磁盘上的文件加载的:

/tmp/25.jpeg



以下代码能够正确打开和提取图像:
auto fmtCtx = avformat_alloc_context();
int err = avformat_open_input(&fmtCtx, "/tmp/25.jpeg", NULL, NULL);

该项目正在使用 libavformat 的缩小版本只包括我们需要的格式。我不认为这是问题的原因,因为在指定路径时文件可以打开并正确处理。我没有看到任何 configure专门针对自定义 IO 上下文支持的选项。

这是有问题的图像: 25.jpeg

最佳答案

问题是由我的编译 ffmpeg 引起的使用自定义配置脚本尝试禁用我没用的所有格式。

如果我没记错的话,缺少的配置标志是 --enable-protocol=pipe .

这是 configure 的参数列表我用来只启用我的应用程序感兴趣的音频和图像文件格式,从而创建一个缩减 ffmpeg build :

--disable-doc
--disable-debug
--disable-avdevice
--enable-swscale
--enable-rdft
--disable-ffmpeg
--disable-ffplay
--disable-ffprobe
--disable-ffserver
--disable-network
--disable-muxers
--disable-demuxers
--disable-zlib
--disable-bzlib
--disable-iconv
--disable-bsfs
--disable-filters
--disable-parsers
--disable-indevs
--disable-outdevs
--disable-encoders
--disable-decoders
--disable-hwaccels
--disable-nvenc
--disable-xvmc
--disable-videotoolbox
--disable-audiotoolbox
--disable-libxcb
--disable-network
--disable-sdl2
--disable-securetransport
--disable-xlib
--disable-filters
--enable-filter=aformat
--enable-filter=anull
--enable-filter=atrim
--enable-filter=format
--enable-filter=null
--enable-filter=setpts
--enable-filter=trim
--disable-protocols
--enable-protocol=file
--enable-protocol=pipe
--enable-demuxer=image2
--enable-demuxer=aac
--enable-demuxer=ac3
--enable-demuxer=aiff
--enable-demuxer=ape
--enable-demuxer=asf
--enable-demuxer=au
--enable-demuxer=avi
--enable-demuxer=flac
--enable-demuxer=flv
--enable-demuxer=matroska
--enable-demuxer=mov
--enable-demuxer=m4v
--enable-demuxer=mp3
--enable-demuxer=mpc
--enable-demuxer=mpc8
--enable-demuxer=ogg
--enable-demuxer=pcm_alaw
--enable-demuxer=pcm_mulaw
--enable-demuxer=pcm_f64be
--enable-demuxer=pcm_f64le
--enable-demuxer=pcm_f32be
--enable-demuxer=pcm_f32le
--enable-demuxer=pcm_s32be
--enable-demuxer=pcm_s32le
--enable-demuxer=pcm_s24be
--enable-demuxer=pcm_s24le
--enable-demuxer=pcm_s16be
--enable-demuxer=pcm_s16le
--enable-demuxer=pcm_s8
--enable-demuxer=pcm_u32be
--enable-demuxer=pcm_u32le
--enable-demuxer=pcm_u24be
--enable-demuxer=pcm_u24le
--enable-demuxer=pcm_u16be
--enable-demuxer=pcm_u16le
--enable-demuxer=pcm_u8
--enable-demuxer=rm
--enable-demuxer=shorten
--enable-demuxer=tak
--enable-demuxer=tta
--enable-demuxer=wav
--enable-demuxer=wv
--enable-demuxer=xwma
--enable-demuxer=dsf
--enable-decoder=aac
--enable-decoder=aac_latm
--enable-decoder=ac3
--enable-decoder=alac
--enable-decoder=als
--enable-decoder=ape
--enable-decoder=atrac1
--enable-decoder=atrac3
--enable-decoder=eac3
--enable-decoder=flac
--enable-decoder=gsm
--enable-decoder=gsm_ms
--enable-decoder=mp1
--enable-decoder=mp1float
--enable-decoder=mp2
--enable-decoder=mp2float
--enable-decoder=mp3
--enable-decoder=mp3adu
--enable-decoder=mp3adufloat
--enable-decoder=mp3float
--enable-decoder=mp3on4
--enable-decoder=mp3on4float
--enable-decoder=mpc7
--enable-decoder=mpc8
--enable-decoder=opus
--enable-decoder=ra_144
--enable-decoder=ra_288
--enable-decoder=ralf
--enable-decoder=shorten
--enable-decoder=tak
--enable-decoder=tta
--enable-decoder=vorbis
--enable-decoder=wavpack
--enable-decoder=wmalossless
--enable-decoder=wmapro
--enable-decoder=wmav1
--enable-decoder=wmav2
--enable-decoder=wmavoice
--enable-decoder=pcm_alaw
--enable-decoder=pcm_bluray
--enable-decoder=pcm_dvd
--enable-decoder=pcm_f32be
--enable-decoder=pcm_f32le
--enable-decoder=pcm_f64be
--enable-decoder=pcm_f64le
--enable-decoder=pcm_lxf
--enable-decoder=pcm_mulaw
--enable-decoder=pcm_s8
--enable-decoder=pcm_s8_planar
--enable-decoder=pcm_s16be
--enable-decoder=pcm_s16be_planar
--enable-decoder=pcm_s16le
--enable-decoder=pcm_s16le_planar
--enable-decoder=pcm_s24be
--enable-decoder=pcm_s24daud
--enable-decoder=pcm_s24le
--enable-decoder=pcm_s24le_planar
--enable-decoder=pcm_s32be
--enable-decoder=pcm_s32le
--enable-decoder=pcm_s32le_planar
--enable-decoder=pcm_u8
--enable-decoder=pcm_u16be
--enable-decoder=pcm_u16le
--enable-decoder=pcm_u24be
--enable-decoder=pcm_u24le
--enable-decoder=pcm_u32be
--enable-decoder=pcm_u32le
--enable-decoder=pcm_zork
--enable-decoder=dsd_lsbf
--enable-decoder=dsd_msbf
--enable-decoder=dsd_lsbf_planar
--enable-decoder=dsd_msbf_planar
--enable-parser=aac
--enable-parser=aac_latm
--enable-parser=ac3
--enable-parser=cook
--enable-parser=dca
--enable-parser=flac
--enable-parser=gsm
--enable-parser=mpegaudio
--enable-parser=tak
--enable-parser=vorbis
--enable-decoder=bmp
--enable-decoder=gif
--enable-decoder=jpeg2000
--enable-decoder=jpegls
--enable-decoder=mjpeg
--enable-decoder=mjpegb
--enable-decoder=pgm
--enable-decoder=png
--enable-decoder=ppm
--enable-decoder=tiff
--enable-demuxer=gif
--enable-demuxer=image2pipe
--enable-demuxer=image_bmp_pipe
--enable-demuxer=image_jpeg_pipe
--enable-demuxer=image_jpegls_pipe
--enable-demuxer=image_pgm_pipe
--enable-demuxer=image_png_pipe
--enable-demuxer=image_tiff_pipe
--enable-demuxer=mjpeg
--enable-demuxer=mjpeg_2000
--enable-encoder=mjpeg
--enable-encoder=png
--enable-muxer=image2
--enable-muxer=mjpeg
--enable-muxer=singlejpeg
--enable-parser=bmp
--enable-parser=mjpeg
--enable-parser=png
--enable-parser=pnm
--enable-bsf=mjpeg2jpeg

该列表很可能包含一些音频和图像处理并非严格需要的额外功能,但这些选项解决了报告的问题。

关于ffmpeg - avformat_open_input 仅在自定义 IO 上下文时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41734219/

69 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com