在raspbian linux上使用ffmpeg录制多个(自生成)视频

在raspbian linux上使用ffmpeg录制多个(自生成)视频,linux,bash,ffmpeg,raspbian,Linux,Bash,Ffmpeg,Raspbian,我是一个非常有天赋的梦游者,所以我决定写一个解决方案,记录我晚上说的话,制作带有字幕的有趣视频。该项目几乎完成了,但我有一个很大的问题,与浓缩视频我之前生成 使用以下命令从单个png帧生成视频部分: ffmpeg -y -framerate 15 -i "${images_file_path}" -c:v libx264 -r 30 -pix_fmt yuv420p "${video_file_path}" ffmpeg -f concat -i "${video_list_path}" -f

我是一个非常有天赋的梦游者,所以我决定写一个解决方案,记录我晚上说的话,制作带有字幕的有趣视频。该项目几乎完成了,但我有一个很大的问题,与浓缩视频我之前生成

使用以下命令从单个png帧生成视频部分:

ffmpeg -y -framerate 15 -i "${images_file_path}" -c:v libx264 -r 30 -pix_fmt yuv420p "${video_file_path}"
ffmpeg -f concat -i "${video_list_path}" -filter_complex "${filter_string} concat=n=${input_file_counter}:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" "${full_video_path}"
然后使用此命令添加声音(从和获得):

到目前为止,所有这些都没有造成任何问题,但我认为了解视频是如何生成的可能是相关的。我可以看所有这些,并得到有效的视频和声音-完整的源代码,这第一部分可以找到

现在,我添加了一个功能,可以使用以下命令生成包含标题和各种先前生成的“视频部分”的“完整视频”:

ffmpeg -y -framerate 15 -i "${images_file_path}" -c:v libx264 -r 30 -pix_fmt yuv420p "${video_file_path}"
ffmpeg -f concat -i "${video_list_path}" -filter_complex "${filter_string} concat=n=${input_file_counter}:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" "${full_video_path}"
但它有点问题,我得到了这个错误:

Invalid file index 1 in filtergraph description [0:v:0] [1:v:0] [2:v:0] [2:a:0] [3:v:0] [4:v:0] [4:a:0] [5:v:0] [6:v:0] [6:a:0] [7:v:0] concat=n=8:v=1:a=1 [v] [a].
完整输出为:

ffmpeg version N-77213-g7c1c453 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.9.2 (Raspbian 4.9.2-10)
  configuration: --enable-shared --enable-gpl --prefix=/usr --enable-nonfree --enable-libmp3lame --enable-libfaac --enable-libx264 --enable-version3 --disable-mmx
  libavutil      55. 10.100 / 55. 10.100
  libavcodec     57. 17.100 / 57. 17.100
  libavformat    57. 20.100 / 57. 20.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 20.100 /  6. 20.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0xc2e900] Auto-inserting h264_mp4toannexb bitstream filter
Input #0, concat, from '/usr/sleeptalk/records-rendered/3enguzpuu2gw0ogk8wkko/videos.txt':
  Duration: N/A, start: 0.000000, bitrate: 61 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 58 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 2 kb/s
    Metadata:
      handler_name    : SoundHandler
Invalid file index 1 in filtergraph description [0:v:0] [1:v:0] [2:v:0] [2:a:0] [3:v:0] [4:v:0] [4:a:0] [5:v:0] [6:v:0] [6:a:0] [7:v:0] concat=n=8:v=1:a=1 [v] [a].
我还编写了一个测试用例,这样您就可以在本地机器上复制它。下载文件。此外,还可以找到渲染“最终移动”的完整脚本


如果你能想出一个主意,那就太好了。在过去的两天里,你很难解决这个问题。

你正在使用concat解复用器和concat过滤器。跳过后者,因为

这是不必要的,而且

b)我不认为解复用器将所有输入文件作为单独的输入导入,因此
0
之外的索引没有意义。此外,concat筛选器需要每个输入文件具有相同数量的流,并且它们的输入分配必须成对进行,即
[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]…

相反,使用

ffmpeg -f concat -i "${video_list_textfile}" -c copy "${full_video_path}"
其中,
${video\u list\u textfile}
是以下格式的文本文件

file 'file1.mp4'
file 'file2.mp4'
file 'file3.mp4'
...

您同时使用concat解复用器和concat过滤器。跳过后者,因为

这是不必要的,而且

b)我不认为解复用器将所有输入文件作为单独的输入导入,因此
0
之外的索引没有意义。此外,concat筛选器需要每个输入文件具有相同数量的流,并且它们的输入分配必须成对进行,即
[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]…

相反,使用

ffmpeg -f concat -i "${video_list_textfile}" -c copy "${full_video_path}"
其中,
${video\u list\u textfile}
是以下格式的文本文件

file 'file1.mp4'
file 'file2.mp4'
file 'file3.mp4'
...

妈的,这很好用,但我用了这个命令后就没有音频了。ffmpeg报告了许多错误,如
[mp4@0x7f8eeb00a400]aac位流错误
流1的编解码器不使用全局头,但容器格式需要全局头。所有输入文件都有音频吗?而且具有相同的属性?对于全局标题,请插入
-flags+global_header
。我正在检查这一点,发现1-3.mp4有mp3作为音频,其余文件使用aac。我希望这将解决我的问题。是的,跨文件需要相同的音频(和视频)属性。该死,这工作得很好,但使用此命令后我根本没有音频。ffmpeg报告了许多错误,如
[mp4@0x7f8eeb00a400]aac位流错误
流1的编解码器不使用全局头,但容器格式需要全局头。所有输入文件都有音频吗?而且具有相同的属性?对于全局标题,请插入
-flags+global_header
。我正在检查这一点,发现1-3.mp4有mp3作为音频,其余文件使用aac。我希望这能解决我的问题。是的,跨文件需要相同的音频(和视频)属性。