您的位置:首页 > 编程语言 > Qt开发

利用qt和ffmpeg软件来制作视频裁剪工具

2014-08-18 09:35 573 查看
0 什么是ffmpeg?

Libav(旧称:FFmpeg)是一个自由软件,可以运行音频和视频多种格式的录影、转档、流功能[1],包含了libavcodec
─这是一个用于多个专案中音频和视频的解码器库,以及 libavformat ——一个音频与视频格式转换库。

libav的旧称"FFmpeg"这个单词中的 "FF" 指的是 "Fast Forward"[2]。有些新手写信给"FFmpeg"的项目负责人,询问FF是不是代表“Fast
Free”或者“Fast Fourier”等意思,"FFmpeg"的项目负责人回信说“Just for the record, the original meaning of "FF" in FFmpeg is "Fast Forward"...”

...

...

二 在命令行下学会ffmpeg使用

cd 进入ffmpeg解压缩目录下的bin目录

ffmpeg.exe -i D:/source.avi -vcodec copy -y -r 25 -ss 8 -t 971 D:/demo.mp4 >> D:\clip_info.txt 2>&1

这里-vcodec copy参数一定要加,这样裁剪的时候不会改变视频的编码方式,裁剪非常快。

ffmpeg主要参数一览

Hyper fast Audio and Video encoder

usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Main options:

-L show license

-h show help

-? show help

-help show help

--help show help

-version show version

-formats show available formats

-codecs show available codecs

-bsfs show available bit stream filters

-protocols show available protocols

-filters show available filters

-pix_fmts show available pixel formats

-sample_fmts show available audio sample formats

-loglevel loglevel set libav* logging level

-v loglevel set libav* logging level

-debug flags set debug flags

-report generate a report

-max_alloc bytes set maximum size of a single allocated block

-f fmt force format

-i filename input file name

-y overwrite output files

-n do not overwrite output files

-c codec codec name

-codec codec codec name

-pre preset preset name

-map_metadata outfile[,metadata]:infile[,metadata] set metadata information of outfile from infile

-t duration record or transcode "duration" seconds of audio/video

-fs limit_size set the limit file size in bytes

-ss time_off set the start time offset

-itsoffset time_off set the input ts offset

-itsscale scale set the input ts scale

-timestamp time set the recording timestamp ('now' to set the current time)

-metadata string=string add metadata

-dframes number set the number of data frames to record

-timelimit limit set max runtime in seconds

-target type specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)

-xerror exit on error

-frames number set the number of frames to record

-tag fourcc/tag force codec tag/fourcc

-filter filter_list set stream filterchain

-stats print progress report during encoding

-attach filename add an attachment to the output file

-dump_attachment filename extract an attachment into a file

-bsf bitstream_filters A comma-separated list of bitstream filters

-dcodec codec force data codec ('copy' to copy stream)

Advanced options:

-map [-]input_file_id[:stream_specifier][,sync_file_id[:stream_s set input stream mapping

-map_channel file.stream.channel[:syncfile.syncstream] map an audio channel from one stream to another

-map_chapters input_file_index set chapters mapping

-benchmark add timings for benchmarking

-dump dump each input packet

-hex when dumping packets, also dump the payload

-re read input at native frame rate

-loop_input deprecated, use -loop

-loop_output deprecated, use -loop

-vsync video sync method

-async audio sync method

-adrift_threshold threshold audio drift threshold

-copyts copy timestamps

-copytb source copy input stream time base when stream copying

-shortest finish encoding within shortest input

-dts_delta_threshold threshold timestamp discontinuity delta threshold

-copyinkf copy initial non-keyframes

-q q use fixed quality scale (VBR)

-qscale q use fixed quality scale (VBR)

-streamid streamIndex:value set the value of an outfile streamid

-muxdelay seconds set the maximum demux-decode delay

-muxpreload seconds set the initial demux-decode delay

-fpre filename set options from indicated preset file

Video options:

-vframes number set the number of video frames to record

-r rate set frame rate (Hz value, fraction or abbreviation)

-s size set frame size (WxH or abbreviation)

-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)

-bits_per_raw_sample number set the number of bits per raw sample

-croptop size Removed, use the crop filter instead

-cropbottom size Removed, use the crop filter instead

-cropleft size Removed, use the crop filter instead

-cropright size Removed, use the crop filter instead

-padtop size Removed, use the pad filter instead

-padbottom size Removed, use the pad filter instead

-padleft size Removed, use the pad filter instead

-padright size Removed, use the pad filter instead

-padcolor color Removed, use the pad filter instead

-vn disable video

-vcodec codec force video codec ('copy' to copy stream)

-sameq use same quantizer as source (implies VBR)

-same_quant use same quantizer as source (implies VBR)

-pass n select the pass number (1 or 2)

-passlogfile prefix select two pass log file name prefix

-vf filter list video filters

-b bitrate video bitrate (please use -b:v)

-dn disable data

三 利用QT4做个简单图形界面工具



这里主要用了QProcess这个类,可以调用外部程序。

关键代码:

QString program = "D:\\maxview_video_demo\\ffmpeg\\ffmpeg-git-985e768-win64-static\\bin\\ffmpeg.exe";

QString inputPath = ui->videopathLineEdit->text();

QFile sourceFile(inputPath);

if(!sourceFile.exists()){

QMessageBox::information(this,QString::fromUtf8("提示"),QString::fromUtf8("找不到源文件"));

return;

}

QString outputPath = QFileInfo(sourceFile).absolutePath() +"/clip.mp4";

QFile destFile(outputPath);

if(destFile.exists()){

destFile.remove();

}

QString startTime = ui->videoStartTimeEdit->time().toString("hh:mm:ss");

QString len= ui->videoLengthTimeEdit->time().toString("hh:mm:ss");

QStringList arguments;

arguments << "-i" << inputPath << "-r" << "25"<<"-ss";

arguments <<startTime<< "-t" << len<< outputPath;

QProcess *clipProcess = new QProcess(this);

connect(clipProcess,SIGNAL(finished(int)),this,SLOT(clipVideoFinished(int)));

clipProcess->start(program, arguments);

当视频截取完成后,进程会发生信号finished(int),并被QProcess捕捉到,这样可以调用

clipVideoFinished函数来通知程序视频裁剪完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: