FFMPEG转码及切片

由于优优好房上有些视频需要批量切片,首先想到的就是FFmpeg。

一开始查阅了大量的博客,论坛,文章,踩了很多坑,后面参照FFmpeg的编译指南,搞定

在此就不赘述ffmpeg的安装

http://trac.ffmpeg.org/wiki/CompilationGuide

我选择的是centos

http://trac.ffmpeg.org/wiki/CompilationGuide/Centos

ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。两个库文件libavcodec和libavformat。

ffmpeg作为媒体文件处理软件,基本用法如下: 
ffmpeg [global_options] {[input_file_options] -i ‘input_file’} ... {[output_file_options] ‘output_file’} ...
输入输出文件通常就是待处理的多媒体文件了。可以是纯粹的音频文件,纯粹的视频文件,或者混合的。 
大部分常见的格式都能够“通杀”。象常见的各种mpeg,AVI封装的DIVX和Xvid等等

对ffmpeg命令选项的了解,先从下面的命令开始
ffmpeg -h
ffmpeg -h long
ffmpeg -h full
man ffmpeg需要安装ffmpeg的手册页条目

各选项参数的解释,详情参见 http://www.ffmpeg.org/ffmpeg.html

扫描二维码关注公众号,回复: 4835735 查看本文章

在切片这块:

ffmpeg -i 1.mp4 -f segment -segment_time 10 -segment_format mpegts -segment_list list_file.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 output_file-%d.ts

这条命令的限制是:要求生成ts分片的输入视频是视频是h.264编码,音频是aac编码的视频文件,从优酷网上下载的视频片段都是符合这个条件的。

上面这段是网上看的,其中的bsf比特流过滤器设置是h264_mp4toannexb,这个要求视频是h.264编码。否则后期切片就会很慢,毕竟需要进行转码。如果服务器没有显卡支持,通过硬转码会很耗时。

这个我们是在windows上进行h.264编码,使用格式化工厂,然后再写shell脚本,批量切片,批量把一个目录的视频生成到另外一个目录,并以视频的文件名创建目录保存切片文件,ffprobe获取视频信息,对超过尺寸的视频进行处理再切片,对没有超过尺寸的视频直接切片。

最后附上脚本,希望对你有帮助

#!/bin/bash

deepcopydir(){  
    for file2 in `ls -a $1`  
    do  
        if [ x"$file2" != x"." -a x"$file2" != x".." ];then  
            if [ -d "$1/$file2" ];then  
                dirpath="$1/$file2"  
                #创建文件
                mkdir -v ${dirpath/videodir/videom3u8}
                deepcopydir "$1/$file2"  
            fi  
        fi  
    done  
}

formatvideo(){
    for file2 in `ls -a $1`  
    do  
        if [ x"$file2" != x"." -a x"$file2" != x".." ];then  
            if [ -d "$1/$file2" ];then  
                formatvideo "$1/$file2"  
            elif [ -f "$1/$file2" ];then  
		videopath="$1/$file2"
                #获取目录
                dirpath=$(dirname $videopath)
                #获取带后缀文件名
                filename=$(basename $videopath)
                #后缀
                after=${filename##*.}
                #文件名
                name=${filename%.*}
                ##echo $videopath  $dirpath $filename $after $name
                m3u8file=${dirpath/videodir/videom3u8}
                mkdir $m3u8file/$name
                ##ffmpeg -i $videopath -c:v libx264 -c:a copy -f hls -threads 8 -hls_time 30 -hls_list_size 0 $m3u8file/$name/index.m3u8

                videoinfo=$(ffprobe -v quiet -print_format json -show_format -show_streams $videopath | jq '.streams[0]' )
                width=$(echo $videoinfo | jq '.width') 
                height=$(echo $videoinfo | jq '.height') 
                if [ $width -lt 960 -o $height -lt 540 ]; then 
                        echo "$width,$height"
                        ffmpeg -i $videopath -f segment -segment_time 5 -segment_format mpegts -segment_list $m3u8file/$name/index.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 $m3u8file/$name/index%d.ts 
                else 
                        echo "width=$width,height=$height"
                        ffmpeg -i $videopath -f segment -segment_time 5 -segment_format mpegts -segment_list $m3u8file/$name/index.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 $m3u8file/$name/index%d.ts 
                fi 
            fi  
        fi  
    done  
}

root='/tmp/'
olddir="${root}videodir"
newdir="${root}videom3u8"
#初始化新的根目录
mkdir -p $newdir
deepcopydir $olddir $newdir
#遍历文件编码
formatvideo $olddir

猜你喜欢

转载自blog.csdn.net/huanyq2008/article/details/86074318