![ffmpeg 在创建视频时挂起](https://linux22.com/image/1266595/ffmpeg%20%E5%9C%A8%E5%88%9B%E5%BB%BA%E8%A7%86%E9%A2%91%E6%97%B6%E6%8C%82%E8%B5%B7.png)
我正在尝试插入带有视频的音频频道:
首先我从原始视频中提取音频进行处理:
ffmpeg -i lotr.mp4 lotr.wav
然后我提取所有帧以供后续处理:
ffmpeg -i lotr.mp4 -f image2 %d.jpg
处理完音频和视频流后,我尝试创建视频
ffmpeg -f image2 -r 15 -i %d.jpg new.mp4
然后与音频合并:
ffmpeg -i new.mp4 -i lotr.wav -map 0:0 -map 1:0 new_w_audio.mp4
结果:CPU 活动 = 100%,进程挂起并且永不返回。 附言:我甚至尝试过不修改图像或音频(所以只是尝试解压然后重新打包视频)但输出仍然相同
FFmpeg version SVN-r26400, Copyright (c) 2000-2011 the FFmpeg developers
built on Jan 18 2011 04:07:05 with gcc 4.4.2
configuration: --enable-gpl --enable-version3 --enable-libgsm --enable-libvorb
is --enable-libtheora --enable-libspeex --enable-libmp3lame --enable-libopenjpeg
--enable-libschroedinger --enable-libopencore_amrwb --enable-libopencore_amrnb
--enable-libvpx --disable-decoder=libvpx --arch=x86 --enable-runtime-cpudetect -
-enable-libxvid --enable-libx264 --enable-librtmp --extra-libs='-lrtmp -lpolarss
l -lws2_32 -lwinmm' --target-os=mingw32 --enable-avisynth --enable-w32threads --
cross-prefix=i686-mingw32- --cc='ccache i686-mingw32-gcc' --enable-memalign-hack
libavutil 50.36. 0 / 50.36. 0
libavcore 0.16. 1 / 0.16. 1
libavcodec 52.108. 0 / 52.108. 0
libavformat 52.93. 0 / 52.93. 0
libavdevice 52. 2. 3 / 52. 2. 3
libavfilter 1.74. 0 / 1.74. 0
libswscale 0.12. 0 / 0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'new.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.93.0
Duration: 00:00:29.66, start: 0.000000, bitrate: 193 kb/s
Stream #0.0(und): Video: mpeg4, yuv420p, 200x134 [PAR 1:1 DAR 100:67], 192 k
b/s, 15 fps, 15 tbr, 15 tbn, 15 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
[wav @ 01fed010] max_analyze_duration reached
Input #1, wav, from 'lotr.wav':
Duration: 00:00:29.90, bitrate: 176 kb/s
Stream #1.0: Audio: pcm_s16le, 11025 Hz, 1 channels, s16, 176 kb/s
File 'new_w_audio.mp4' already exists. Overwrite ? [y/N] y
[buffer @ 01b03820] w:200 h:134 pixfmt:yuv420p
Output #0, mp4, to 'new_w_audio.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2mp41
creation_time : 1970-01-01 00:00:00
encoder : Lavf52.93.0
Stream #0.0(und): Video: mpeg4, yuv420p, 200x134 [PAR 1:1 DAR 100:67], q=2-3
1, 200 kb/s, 15 tbn, 15 tbc
Metadata:
creation_time : 1970-01-01 00:00:00
Stream #0.1: Audio: aac, 11025 Hz, 1 channels, s16, 64 kb/s
Stream mapping:
Stream #0.0 -> #0.0
Stream #1.0 -> #0.1
Press [q] to stop encoding
答案1
可能是多种原因。在处理未压缩的视频编解码器时,视频编辑通常会出现挂起。我不确定我是否读到过原始视频是 yuv420p 编解码器。它可能在尝试处理大量内存或直接将图像压缩为 mp4 时挂起。我能想到的一件事是先转换为 avi,即输出为 avi 但强制使用无损编解码器,如 camtasia / camstudio(我认为 ffmpeg 支持它),这样它就不会那么“沉重”,然后再进行第二次操作以转换为 mp4。其他问题是... -r15?您肯定更清楚原始视频的 fps 是多少,但它以前是 24fps 左右,不是吗?
另外...您也可以强制输出编解码器,而不仅仅是格式。MP4 与 .h264 编解码器配合得很好,质量很高,体积却小得令人难以置信。如果我没记错的话,ffmpeg 也支持它。(您可能首先想尝试一下这个...)
编辑:请记住 -codecs 在命令行中为您提供编解码器列表。当然,您可以在 Win 控制台中输入 ffmpeg -codecs > codecs.txt,以便于阅读、搜索等。也可以使用 -formats 等。
答案2
尝试更新到最新版本的 ffmpeg。
答案3
在我处理大量帧(超过 10k)时,即使 bash 脚本中使用了最新版本(4.2.2),ffmpeg 也会出现冻结现象。奇怪的是,当我在终端中运行相同的命令时,它会顺利完成,我无法重现冻结现象。
事实证明,ffmpeg 在后台执行时会挂起,并且输出管道已满。
就我而言,将日志级别设置为不太详细即可解决问题。
ffmpeg -loglevel error