在 raspbian linux 上使用 ffmpeg 连接多个 (self-generated) 视频
Concat multiple (self-generated) videos using ffmpeg on raspbian linux
我是一个很有天赋的说梦话者,所以我决定写一个解决方案,记录我晚上说的话,制作带有字幕的搞笑视频。该项目即将完成,但我在连接之前生成的视频时遇到了一个大问题。
视频部分是使用以下命令从单个 png 帧生成的:
ffmpeg -y -framerate 15 -i "${images_file_path}" -c:v libx264 -r 30 -pix_fmt yuv420p "${video_file_path}"
然后使用此命令添加声音(从 #9049970 and #11779490 获得):
ffmpeg -y -i "${video_file_path}" -i "${mp3_file_path}" -map 0:v -map 1:a -vcodec copy -acodec copy -shortest "${final_video_file_path}"
到目前为止,所有这些都没有造成任何问题,但我认为了解视频的生成方式可能很重要。我可以观看所有这些并获得有效的视频和声音 - 可以找到第一部分的完整源代码 here。
现在我添加了一个功能,它能够生成 "full videos",其中包含一个标题和之前使用此命令生成的各种数量的 "video parts":
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].
我还写了一个测试用例,所以你可以在你的本地机器上重现它。下载文件 from my dropbox. Also, the full script that renders the "final move" can be found here。
如果有一个想法就太好了,最近两天很难解决这个问题。
您同时使用了 concat 分离器和 concat 过滤器。跳过后者,因为
a) 没有必要
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_list_textfile}
是格式为
的文本文件
file 'file1.mp4'
file 'file2.mp4'
file 'file3.mp4'
...
我是一个很有天赋的说梦话者,所以我决定写一个解决方案,记录我晚上说的话,制作带有字幕的搞笑视频。该项目即将完成,但我在连接之前生成的视频时遇到了一个大问题。
视频部分是使用以下命令从单个 png 帧生成的:
ffmpeg -y -framerate 15 -i "${images_file_path}" -c:v libx264 -r 30 -pix_fmt yuv420p "${video_file_path}"
然后使用此命令添加声音(从 #9049970 and #11779490 获得):
ffmpeg -y -i "${video_file_path}" -i "${mp3_file_path}" -map 0:v -map 1:a -vcodec copy -acodec copy -shortest "${final_video_file_path}"
到目前为止,所有这些都没有造成任何问题,但我认为了解视频的生成方式可能很重要。我可以观看所有这些并获得有效的视频和声音 - 可以找到第一部分的完整源代码 here。
现在我添加了一个功能,它能够生成 "full videos",其中包含一个标题和之前使用此命令生成的各种数量的 "video parts":
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].
我还写了一个测试用例,所以你可以在你的本地机器上重现它。下载文件 from my dropbox. Also, the full script that renders the "final move" can be found here。
如果有一个想法就太好了,最近两天很难解决这个问题。
您同时使用了 concat 分离器和 concat 过滤器。跳过后者,因为
a) 没有必要
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_list_textfile}
是格式为
file 'file1.mp4'
file 'file2.mp4'
file 'file3.mp4'
...