确定我在尝试编码MOV文件时收到'av_interleaved_write_frame():不允许操作'错误。首先,我需要概述其背后的条件。
我通过在cron上运行的PHP脚本编码12个不同分辨率大小和格式类型的不同文件。它基本上可以抓取250mb HD MOV文件,并以4种不同的帧大小编码为MOV,MP4和WMV文件类型。
现在脚本需要10分钟才能运行并编码250mb输入文件的每个文件。我正在输出处理时间,一旦脚本上的时间到达10分钟,FFMPEG崩溃并返回“av_interleaved_write_frame():不允许操作”对于当前正在编码的文件和尚未编码的所有其他剩余文件。
如果输入视频为150MB,则脚本运行的总时间不到10分钟,因此它可以很好地编码所有视频。另外,如果我在单个文件上运行FFMPEG命令,它为250mb文件失败,它会对文件进行编码而没有任何问题。
从做到研究错误“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,或者它是否是我需要查看的服务器配置。
答案 0 :(得分:1)
这个问题的一个简单可解决原因(如果您在搜索此问题时发现此问题,就像我所做的那样)是您尝试将文件写入的分区已满。确保您有足够的可用空间来写入文件。在linux / unix上,这就像运行一样简单
$ df -h
要解决此问题,只需将文件移至另一个分区,删除不需要的文件以及清空垃圾箱即可释放足够的空间。
答案 1 :(得分:0)
此补丁(从ffmpeg issue 807的页面链接)解决了我重新编码视频并将音频从实时捕获的flv文件复制到avi文件的问题:
答案 2 :(得分:0)
当我尝试使用自定义 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;
错误消失了。