【问题标题】:FFMPEG av_interleaved_write_frame(): Operation not permittedFFMPEG av_interleaved_write_frame():不允许操作
【发布时间】:2020-12-21 21:48:43
【问题描述】:

好的,我在尝试对 MOV 文件进行编码时收到“av_interleaved_write_frame(): Operation not allowed”错误。首先我需要概述它背后的条件。

我通过在 cron 上运行的 PHP 脚本对 12 个不同分辨率大小和格式类型的不同文件进行编码。基本上,它抓取一个 250mb 的高清 MOV 文件并将其编码为 4 种不同的帧大小,如 MOV、MP4 和 WMV 文件类型。

现在脚本需要 10 多分钟来运行并为 250mb 输入文件的每个文件进行编码。我正在输出处理时间,一旦脚本上的时间达到 10 分钟,FFMPEG 就会崩溃并为当前正在编码的文件和所有其他尚未编码的文件返回“av_interleaved_write_frame(): Operation not allowed”。

如果输入视频为 150MB,则脚本运行的总时间不到 10 分钟,因此它可以很好地编码所有视频。此外,如果我对 250mb 文件失败的单个文件运行 FFMPEG 命令,它会毫无问题地对文件进行编码。

从对错误“av_interleaved_write_frame()”的研究开始,它似乎与我理解的输入文件的时间戳有关。但是说在我的实例中似乎并非如此,因为如果我单独执行,我可以毫无问题地对文件进行编码。

ffmpeg 命令示例

ffmpeg -i GVowbt3vsrXL.mov -s 1920x1080 -sameq -vf "unsharp" -y GVowbt3vsrXL_4.wmv

失败文件在 10 分钟时输出错误。请记住,如果我自己运行该命令,则只有在脚本达到 10 分钟时才会出现问题。

'output' =>
     array (
       0 => 'FFmpeg version SVN-r24545, Copyright (c) 2000-2010 the FFmpeg developers',
       1 => '  built on Aug 20 2010 23:32:02 with gcc 4.1.2 20080704 (Red Hat 4.1.2-48)',
       2 => '  configuration: --enable-shared --enable-gpl --enable-pthreads --enable-nonfree --cpu=opteron --extra-cflags=\'-O3 -march=opteron -mtune=opteron\' --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-avfilter --enable-filter=movie --enable-avfilter-lavf --enable-swscale',
       3 => '  libavutil     50.23. 0 / 50.23. 0',
       4 => '  libavcore      0. 1. 0 /  0. 1. 0',
       5 => '  libavcodec    52.84. 1 / 52.84. 1',
       6 => '  libavformat   52.77. 0 / 52.77. 0',
       7 => '  libavdevice   52. 2. 0 / 52. 2. 0',
       8 => '  libavfilter    1.26. 1 /  1.26. 1',
       9 => '  libswscale     0.11. 0 /  0.11. 0',
       10 => 'Input #0, mov,mp4,m4a,3gp,3g2,mj2, from \'/home/hdfootage/public_html/process/VideoEncode/_tmpfiles/GVowbt3vsrXL/GVowbt3vsrXL.mov\':',
       11 => '  Metadata:',
       12 => '    major_brand     : qt',
       13 => '    minor_version   : 537199360',
       14 => '    compatible_brands: qt',
       15 => '  Duration: 00:00:20.00, start: 0.000000, bitrate: 110802 kb/s',
       16 => '    Stream #0.0(eng): Video: mjpeg, yuvj422p, 1920x1080 [PAR 72:72 DAR 16:9], 109386 kb/s, 25 fps, 25 tbr, 25 tbn, 25 tbc',
       17 => '    Stream #0.1(eng): Audio: pcm_s16be, 44100 Hz, 2 channels, s16, 1411 kb/s',
       18 => '[buffer @ 0xdcd0e0] w:1920 h:1080 pixfmt:yuvj422p',
       19 => '[unsharp @ 0xe00280] auto-inserting filter \'auto-inserted scaler 0\' between the filter \'src\' and the filter \'Filter 0 unsharp\'',
       20 => '[scale @ 0xe005b0] w:1920 h:1080 fmt:yuvj422p -> w:1920 h:1080 fmt:yuv420p flags:0xa0000004',
       21 => '[unsharp @ 0xe00280] effect:sharpen type:luma msize_x:5 msize_y:5 amount:1.00',
       22 => '[unsharp @ 0xe00280] effect:none type:chroma msize_x:0 msize_y:0 amount:0.00',
       23 => 'Output #0, asf, to \'/home/hdfootage/public_html/process/VideoEncode/_tmpfiles/GVowbt3vsrXL/GVowbt3vsrXL_4.wmv\':',
       24 => '  Metadata:',
       25 => '    WM/EncodingSettings: Lavf52.77.0',
       26 => '    Stream #0.0(eng): Video: msmpeg4, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=2-31, 200 kb/s, 1k tbn, 25 tbc',
       27 => '    Stream #0.1(eng): Audio: libmp3lame, 44100 Hz, 2 channels, s16, 64 kb/s',
       28 => 'Stream mapping:',
       29 => '  Stream #0.0 -> #0.0',
       30 => '  Stream #0.1 -> #0.1',
       31 => 'Press [q] to stop encoding',
       32 => '[msmpeg4 @ 0xdccb50] warning, clipping 1 dct coefficients to -127..127',

然后就出错了

frame=   75 fps=  5 q=1.0 size=   12704kB time=2.90 bitrate=3588 6.0kbits av_interleaved_write_frame(): Operation not permitted',
     )

以前有人遇到过这种问题吗?这似乎与时间戳有关,但只是因为脚本运行的时间超过了 10 分钟。它可能与 PHP/Apache 配置有关,但我不知道它是 FFMPEG 还是我需要查看的服务器配置。

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    这个问题的一个容易解决的原因(如果你在搜索这个问题时发现了这个问题,就像我一样)是当你试图将文件写入的分区已满时。确保您有足够的可用空间来写入文件。在 linux/unix 上,这就像运行一样简单

    $ df -h
    

    要解决此问题,只需通过将文件移动到另一个分区、删除不需要的文件和清空垃圾箱来释放足够的空间。

    【讨论】:

      【解决方案2】:

      这个补丁(链接自 ffmpeg 问题 807 的页面)解决了我重新编码视频并将音频从实时捕获的 flv 文件复制到 avi 文件的问题:

      https://roundup.ffmpeg.org/file1098/utils.c.patch

      【讨论】:

      • 有人知道我现在在哪里可以找到那个文件吗?
      【解决方案3】:

      当我尝试使用这样的自定义 AVIOContext 在 mpeg 传输流中多路复用 1920x1080 视频时遇到了这个问题:

      mAVIOBufferSize = 1024 * 10;
      mAVIOBuffer = static_cast<unsigned char *>(av_malloc(mAVIOBufferSize));
      mAVIOContext = avio_alloc_context(
              mAVIOBuffer,
              mAVIOBufferSize,
              1,
              this,
              NULL,
              write_packet,
              NULL
      );
      mOutputContext->pb = mAVIOContext;
      

      问题是我的 mAVIOBufferSize 太小,无法将 av_interleaved_write_frame 函数想要传递给 write_packet 函数的一些数据。 我通过增加 mAVIOBufferSize 解决了这个问题

      mAVIOBufferSize = 1024 * 1024;
      

      然后错误消失了。

      【讨论】:

        猜你喜欢
        • 2021-02-10
        • 2012-03-10
        • 2011-02-16
        • 1970-01-01
        • 2012-01-03
        • 2021-01-01
        • 2014-11-01
        • 2014-06-30
        • 2012-03-19
        相关资源
        最近更新 更多