我正在尝试使用ffmpeg编写一个批处理文件,以自动完成从4gb块中记录的工作中拍摄素材的冗余日常任务(这是大多数数码单反相机和GoPro的标准配置),并将剪辑拆分为2gb文件用于流式传输。我们的想法是让脚本检查外部驱动器FOOTAGE的文件夹@import并在2gb之后拆分文件(因为最大大小为4gb,这将减少多次拆分的需要)。
我也试图修改分割文件的文件名,因此FILE1为4gb,它分别分为FILE1_1和FILE1_2,每个分别为2GB。我尝试过的所有内容都将原始文件复制到两个新的相同文件中 - 没有拆分或任何其他文件。
在做了一些谷歌搜索并在这里阅读了一些答案之后,我找到了这篇文章,但这是基于持续时间而不是大小(以不同质量水平录制视频片段使这一点毫无意义):Split into equal parts and convert many mp4 videos using ffmpeg
有人可以帮我吗?我没有遇到任何可用的解决方案,利用我理解的方法,使用-fs limit_size,我真的想了解它是如何工作的。
更新:也发现了这一点,但它在四年内没有更新,我没有看到有关分裂的任何内容会证明有用:
答案 0 :(得分:3)
答案 1 :(得分:3)
我只是遇到了同样的问题,在这里找不到解决方案之后,我为此工作编写了一个快速的bash脚本。
功能:
-fs
-标志限制文件大小仅包含三个参数:源文件名,每个部分所需的文件大小以及ffmpeg所需的参数。
将文件拆分为64MB的示例调用:
./split-video.sh huge-video.mov 64000000 "-c:v libx264 -crf 23 -c:a copy -vf scale=960:-1"
最后,脚本的源代码:
#!/bin/bash
# Short script to split videos by filesize using ffmpeg by LukeLR
if [ $# -ne 3 ]; then
echo 'Illegal number of parameters. Needs 3 parameters:'
echo 'Usage:'
echo './split-video.sh FILE SIZELIMIT "FFMPEG_ARGS'
echo
echo 'Parameters:'
echo ' - FILE: Name of the video file to split'
echo ' - SIZELIMIT: Maximum file size of each part (in bytes)'
echo ' - FFMPEG_ARGS: Additional arguments to pass to each ffmpeg-call'
echo ' (video format and quality options etc.)'
exit 1
fi
FILE="$1"
SIZELIMIT="$2"
FFMPEG_ARGS="$3"
# Duration of the source video
DURATION=$(ffprobe -i "$FILE" -show_entries format=duration -v quiet -of default=noprint_wrappers=1:nokey=1|cut -d. -f1)
# Duration that has been encoded so far
CUR_DURATION=0
# Filename of the source video (without extension)
BASENAME="${FILE%.*}"
# Extension for the video parts
#EXTENSION="${FILE##*.}"
EXTENSION="mp4"
# Number of the current video part
i=1
# Filename of the next video part
NEXTFILENAME="$BASENAME-$i.$EXTENSION"
echo "Duration of source video: $DURATION"
# Until the duration of all partial videos has reached the duration of the source video
while [[ $CUR_DURATION -lt $DURATION ]]; do
# Encode next part
echo ffmpeg -i "$FILE" -ss "$CUR_DURATION" -fs "$SIZELIMIT" $FFMPEG_ARGS "$NEXTFILENAME"
ffmpeg -ss "$CUR_DURATION" -i "$FILE" -fs "$SIZELIMIT" $FFMPEG_ARGS "$NEXTFILENAME"
# Duration of the new part
NEW_DURATION=$(ffprobe -i "$NEXTFILENAME" -show_entries format=duration -v quiet -of default=noprint_wrappers=1:nokey=1|cut -d. -f1)
# Total duration encoded so far
CUR_DURATION=$((CUR_DURATION + NEW_DURATION))
i=$((i + 1))
echo "Duration of $NEXTFILENAME: $NEW_DURATION"
echo "Part No. $i starts at $CUR_DURATION"
NEXTFILENAME="$BASENAME-$i.$EXTENSION"
done
希望,这会有所帮助:)
答案 2 :(得分:0)
一个想法是使用ffmpeg和-fs选项。这将限制文件大小。输出文件的大小略大于请求的文件大小。
这只会创建一个文件。但是你可以构建一个循环,直到整个文件被拆分。
首先创建文件的一部分,然后检查文件的长度:
ffprobe -i input.file -show_format -v quiet | sed -n 's/duration=//p'
然后使用-ss
启动另一个带偏移量的文件之后再进行一轮编码,直到整个文件被拆分。您还可以使用流式副本进行音频和视频