【7种使用FFmpeg分割视频的方法】【转载】

这篇具有很好参考价值的文章主要介绍了【7种使用FFmpeg分割视频的方法】【转载】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

做视频媒体运营的朋友要分割视频有很多工具可以用,例如:剪映。如果要把视频分割做成批量任务或者需要很多自定义功能,那么FFmpeg是个不错的选择,FFmpeg是个命令行工具,也可以写程序调用,对技术人员来说使用起来比较灵活,对于非技术人员可能稍有点麻烦。下面介绍7种使用FFmpeg分割视频的方法。

01

将视频分割成帧

ffmpeg -i video.mp4 thumb%04d.jpg -hide_banner

此命令允许您从视频中提取特定帧,这些帧是组成视频的图像文件。例如视频以每秒24帧的速度运行,则意味着在视频播放时,每秒有24张图像显示在屏幕上。此命令可用于将视频分割为帧并提取单个帧。

02

按大小拆分视频

./split-video.sh huge-video.mov 64000000 "-c:v libx264 -crf 23 -c:a copy -vf scale=960:-1"

在命令中,数字64000000表示64MB,这意味着您的视频将被拆分为每个大小为64MB的块。您可以更改该数字以指定大小。

此命令允许您将较大的视频剪切为特定文件大小的较小视频。当您的视频很大,但只需要特定大小的特定部分用于上传或共享时,这个命令就很有用。其中split-video.sh是依赖于ffmpeg的shell脚本,脚本代码如下:

#!/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 1fi
FILE="$1"SIZELIMIT="$2"FFMPEG_ARGS="$3"
# Duration of the source videoDURATION=$(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 farCUR_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 parti=1
# Filename of the next video partNEXTFILENAME="$BASENAME-$i.$EXTENSION"
echo "Duration of source video: $DURATION"
# Until the duration of all partial videos has reached the duration of the source videowhile [[ $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

03

将视频分割为相等持续时间的部分

ffmpeg -i "input_video.MTS" -ss 164 -f segment -segment_time 120 -vcodec copy -reset_timestamps 1 -map 0:0 -an output_video%d.MTS

此命令可用于将视频分割为多个持续时间相同的部分。这对于需要或偏好特定视频持续时间的社交媒体网站非常有用。

04

按场景拆分视频

split.sh -d 0.5 -o /tmp/parts -f file.mp4

这个命令检测单个场景并不总是很准确,但可以试试。split.sh 的内容如下:​​​​​​​

# Splits video to separate scenes files when full black frames are found in the video# Inspired by https://gist.github.com/achesco/4dc2ebf13378a0a61fc26c7fe01f539e# Who got inspired by https://stackoverflow.com/a/38205105
#!/bin/bash
file=""out="./"dur=0.05stripaudio=""ratio=1.00th=0.05add=0.00trim=0.00
usage () {  echo "Usage: $(basename $0) [[[-o folder] [-d black duration]] | [-h]] -f file.mp4"  echo  echo "Options:"  echo "-f, --file          Input file"  echo "-o, --out           Outpup files folder path, default"  echo "                    to current folder"  echo "-d, --dur           Duration for black detection in seconds. 0.05 default (practical single frame)"  echo "-r, --ratio        ffmpeg pic_th : Set the threshold for considering a picture black. 1.00 default"  echo "-th, --threshold   ffmpeg pix_th : Set the threshold for considering a pixel black. 0.00 default."  echo "-t, --trim          Substracts to splitting timestamp in seconds. 0 default"  echo "-a, --add           Adds to splitting timestamp in seconds. 0 default"  echo "-sa, --strip-audio  Strip audio"  echo "-h, --help          Display this help message"  echo  echo "Example: split.sh -d 0.5 -o /tmp/parts -f file.mp4"  echo "Splits file.mp4 file to scenes with black frames during more than 0.5 second"  echo "and saves output parts to /tmp/parts folder"}
if [ "$1" = "" ]; then  usagefi
while [ "$1" != "" ]; do  case $1 in    -f | --file )      shift      file=$1      ;;    -d | --dur )      shift      dur=$1      ;;    -r | --ratio )      shift      ratio=$1      ;;    -th | --threshold )      shift      th=$1      ;;    -o | --out )      shift      out=$1      ;;    -t | --trim )      shift      trim=$1      ;;    -a | --add )      shift      add=$1      ;;    -sa | --strip-audio )      stripaudio="-an"      ;;    -h | --help )      usage      exit      ;;    * )      usage      exit 1  esac  shiftdone
cut_part () {  duration_flag=""  if [[ "$3" != "" ]]; then    duration_flag="-t"  fi  echo "cutting from $1 during $3"  printf -v fileout "$out/%04d_%s" $2 $filename  ffmpeg -y -loglevel error -hide_banner -i $file -ss $1 $stripaudio $duration_flag $3 $fileout < /dev/null}
filename=`basename $file`mkdir -p $outtimefrom=0i=1
ffmpeg -i $file -vf blackdetect=d=$dur:pic_th=$ratio:pix_th=$th -f null - 2> ffoutblack_start=( $(grep blackdetect ffout | grep black_start:[0-9.]* -o | grep "[0-9]*(\.[0-9]*)?" -oE) )black_duration=( $(grep blackdetect ffout | grep black_duration:[0-9.]* -o | grep "[0-9]*(\.[0-9]*)?" -oE) )> timestampsfor ii in "${!black_start[@]}"; do  half=$(bc -l <<< "${black_duration[$ii]}/2")  middletime=$(bc -l <<< "${black_start[$ii]} + $half")  echo $middletime | LC_ALL=en_US.UTF-8 awk '{printf "%f", $0}' >> timestamps  echo "" >> timestampsdone
while read -r timestamp; do  duration=`bc -l <<< "$timestamp-$timefrom+$add-$trim" | LC_ALL=en_US.UTF-8 awk '{printf "%f", $0}'`  cut_part $timefrom $i $duration  timefrom=`bc -l <<< "$timestamp+$add-$trim" | LC_ALL=en_US.UTF-8 awk '{printf "%f", $0}'`  i=`expr $i + 1`done < timestamps
if [[ "$timefrom" != 0 ]]; then  cut_part $timefrom $ifi

另外还有一个python 替代方案——scenedetect。​​​​​​​

#安装场景检测所需模块pip install scenedetect[opencv] -i https://pypi.tuna.tsinghua.edu.cn/simple
#检验是否已安装场景检测所需模块pip list
click coloramanumpy opencv-pythonscenedetect   0.5.5tqdm

使用方式​​​​​​​

scenedetect --input my_video.mp4 --output my_video_scenes --stats my_video.stats.csv time --start 00:05:00 --end 00:06:00 detect-content #对输入视频执行内容检测算法list-scenes # 打印场景列表并输出到CSV文件split-video # 使用ffmpeg或mkvMerge分割输入视频

测试

scenedetect --input /Users/zgq/Downloads/video.mp4 --output /Users/zgq/Downloads/my_video_scenes time --start 00:00:00 --end 00:01:00 detect-content split-video

05

按时间或持续时间分割视频​​​​​​​

ffmpeg -ss 00:00:00 -t 00:50:00 -i largefile.mp4 -acodec copy \-vcodec copy smallfile.mp4

上面的命令将视频从开始的50分钟分割。你也可以随意改变参数。只需重复该过程,就可以把剩余部分的视频得分割成多个部分。

06

按宽度分割视频

ffmpeg -i input.mp4 -filter:v "crop=iw*(5/10):ih*(5/10):iw:0" output.mp4

在上面的例子中,视频将被裁剪为原高度和宽度的一半。要保持相同的高度,只需将ih组件的参数更改为10/10。您还可以通过在上面示例中的引号内使用:keep_aspect=1参数来保持长宽比。命令如下:

ffmpeg -i input.mp4 -filter:v "crop=iw*(5/10):ih*(5/10):iw:0:keep_aspect=1" output.mp4

07

FFmpeg水平分割视频

这本质上和上一个是相同的裁剪功能,但不是将其裁剪为更小的宽度,而是保持宽度不变,并将视频的高度降低50%。以下两个命令,一个是不带高宽比例,一个带高宽比例:

ffmpeg -i input.mp4 -filter:v "crop=iw*(5/10):ih*(5/10):iw:0" output.mp4
ffmpeg -i input.mp4 -filter:v "crop=iw*(5/10):ih*(5/10):iw:0:keep_aspect=1" output.mp4

原文链接:

7种使用FFmpeg分割视频的方法 文章来源地址https://www.toymoban.com/news/detail-850052.html

到了这里,关于【7种使用FFmpeg分割视频的方法】【转载】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云国际站代理商:FFmpeg 处理音视频文件的常用方法

    阿里云代理商( 聚搜云 )专业服务于阿里云ECS服务器采购、阿里云Ddos采购、阿里云waf采购、对象存储OSS、阿里云企业邮箱采购、阿里云国际站代理商、阿里云国际站充值、云安全中心(态势感知)、阿里云高可用云数据库RDS、web应用云waf防火墙、阿里云vpc企业网、阿里云

    2024年02月02日
    浏览(77)
  • 音视频开发五:visual studio集成使用FFmpeg

    ffmpeg 官网 - download - 选择Windows系统 - 选择gyan.dev版本- shared版本 在Windows系统上,Gyan.dev和BtbN都提供了FFmpeg的预编译版本。Gyan.dev通常使用MSVC编译器,而BtbN使用MinGW编译器。因此,Gyan.dev的版本可能会更符合Windows标准,而BtbN的版本可能会更加开放和跨平台。 选择 shared版本 各

    2024年02月04日
    浏览(63)
  • 强大开源的音视频处理工具ffmpeg安装与使用

    FFmpeg 是一个开源的跨平台音视频处理工具,提供了丰富的命令行模式下音视频处理功能,包括格式转换、编解码、过滤器应用等。 由于 FFmpeg 支持的格式广泛,且可用于多个平台和操作系统(如 Windows、Linux、MacOS 等),因此它已成为许多多媒体应用程序和服务的核心组件。

    2024年02月05日
    浏览(74)
  • 音视频处理工具FFmpeg与Java结合的简单使用

    一、什么是FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcod

    2024年02月11日
    浏览(66)
  • 使用FFmpeg将本地文件通过UDP推流的音视频

    推流是指将音视频数据通过网络传输到指定的目标端,而FFmpeg是一个功能强大的跨平台多媒体处理工具,可以用于音视频编解码、转码、处理等操作。本文将介绍如何使用FFmpeg将本地文件通过UDP协议进行推流,实现音视频数据的传输。 首先,需要确保已经安装了FFmpeg工具。如

    2024年03月19日
    浏览(69)
  • 音视频开发:ffplay使用ffmpeg滤镜实现倍速播放

    曾经为实现倍速播放使用过ffmpeg,对音频使用atempo滤镜即可实现变速不变调。但是当时效果并不是特别好,和soundtouch相比处理后的音质有明显的区别。最近用新版本的ffmpeg滤镜重新实现了倍速播放,发现效果变好,已经达到可接受的程度,所以在此分享具体实现。 ffmpeg倍速

    2024年02月03日
    浏览(110)
  • Java工程使用ffmpeg进行音视频格式转换(ws.schild)

    JAVE (Java Audio Video Encoder)是一个纯Java的音视频编码器和解码器库,它是基于FFmpeg。JAVE库提供了一些简单易用的API,用于音频和视频格式的转换、编码、解码等操作。它对于一些基本的音视频处理任务来说是一个不错的选择。 这些库都是基于FFmpeg的,并允许在Java中处理音频和

    2024年02月14日
    浏览(98)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(58)
  • ffmpeg系列学习——FFmpeg的音视频处理

    1.音视频的采样率、采样位深度和声道数 音频和视频的采样率、采样位深度和声道数是媒体文件中的重要参数,它们会直接影响到音视频的质量和文件大小。下面对它们进行详细解释: 采样率 采样率指音频每秒钟采样的次数,用赫兹(Hz)表示。采样率越高,音频的还原度越

    2024年02月04日
    浏览(64)
  • 音视频 ffmpeg视频裁剪

    将输入视频帧的宽度和高度从x和y值表示的位置裁剪到指定的宽度和高度;x和y是输出的左上角坐标,协调系统的中心是输入视频帧的左上角。 如果使用了可选的keep_aspect参数,将会改变输出SAR(样本宽比)以补偿新的DAR(显示长宽比) 推荐一个零声学院项目课,个人觉得老师讲得不

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包