1.ffmpeg提取多轨视频中的音频

a).先用ffmpeg查看视频文件信息

  1. # ffmpeg -i "冰雪奇缘BD双语双字.mkv"
  2. ffmpeg -i "冰雪奇缘BD双语双字.mkv"
1. ffmpeg version 3.4.2-2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu2)
  configuration: --prefix=/usr --extra-version=2 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, matroska,webm, from '冰雪奇缘BD双语双字.mkv':
  Metadata:
    encoder         : libebml v1.3.0 + libmatroska v1.4.0
    creation_time   : 2014-03-03T11:32:36.000000Z
  Duration: 01:42:13.06, start: 0.000000, bitrate: 2691 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
    Stream #0:1(eng): Audio: ac3, 48000 Hz, stereo, fltp, 448 kb/s (default)
    Metadata:
      title           : 英语
    Stream #0:2(chi): Audio: ac3, 48000 Hz, stereo, fltp, 448 kb/s
    Metadata:
      title           : 国语

 b).可以看到Audio的Stream有2个,分别获取这两个audio音轨的命令是:

  1. ffmpeg -i 冰雪奇缘BD双语双字.mkv -map 0:1 -b:a 64k.mp3   
  2. ffmpeg -i 冰雪奇缘BD双语双字.mkv -map 0:2 -b:a 64k.mp3

 

参数解释:

-i 表示input,即输入文件

-f 表示format,即输出格式

-vn表示vedio not,即输出不包含视频

-b:a 64k为比特率,默认为128K,这里压缩一下,采用64K

 

 

####################视频旋转

 

顺时针旋转画面90度

ffmpeg -i test.mp4 -vf "transpose=1" out.mp4

逆时针旋转画面90度

ffmpeg -i test.mp4 -vf "transpose=2" out.mp4

顺时针旋转画面90度再水平翻转

ffmpeg -i test.mp4 -vf "transpose=3" out.mp4

逆时针旋转画面90度水平翻转

ffmpeg -i test.mp4 -vf "transpose=0" out.mp4

水平翻转视频画面

ffmpeg -i test.mp4 -vf hflip out.mp4

垂直翻转视频画面

ffmpeg -i test.mp4 -vf vflip out.mp4


###########################视频切割

1. 导言

ffmepg剪切视频,很方便,但是也有很大缺陷: 
(1)剪切时间点不精确 
(2)有时剪切的视频开头有黑屏

造成这些问题的原因是ffmpeg无法seek到非关键帧上。 
一下本文通过一些参数配置尽可能地减轻以上问题


2. 基本剪切方法

ffmpeg -i test.mp4 -ss 10 -t 15 -codec copy cut.mp4
  • 1

参数分析:

-i : source 
-ss:start time 
-t :duration 
-c :video,audio codec

时间格式:

  • x秒
  • HOURS:MM:SS.MICROSECONDS

可以设置输出视频的编码格式

-vcodec xxx 
-acodec xxx

把-ss, -t参数放在-i参数之后,是对输出文件执行的seek操作 
输入文件会逐帧解码,直到-ss设置的时间点为止,这么操作会很慢,虽然时间点是准确的,但是很容易出现黑屏问题。


3. 参数优化

(1)将-ss, -t 参数放在-i参数之前

ffmpeg -ss 10 -t 15 -i test.mp4 -codec copy cut.mp4
  • 1

对输入文件执行seek操作,会seek到-ss设置的时间点前面的关键帧上。 
时间不精确,但是不会出现黑屏

(2)accurate_seek 
剪切时间更加精确

ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy cut.mp4
  • 1

PS:accurate_seek必须放在-i参数之前

(3)avoid_negative_ts 
如果编码格式采用的copy 最好加上 -avoid_negative_ts 1参数

ffmpeg -ss 10 -t 15 -accurate_seek -i test.mp4 -codec copy -avoid_negative_ts 1 cut.mp4
  • 1

4. 参考文献

[1] http://trac.ffmpeg.org/wiki/Seeking

 

 

 

#######################################################

 

将视频转为图片:

 

ffmpeg -i S1E01_踏水坑.avi -r 1 -ss 00:00:00 -t 20 %03d.jpg

意思是给 ffmpeg 输入一个叫 S1E01_踏水坑.avi 的文件,让它以每秒一帧的速度,从第0秒开始一直截取 20 秒长的时间,截取到的每一幅图像,都用 3 位数字自动生成从小到大的文件名。

 

 

####################

合并视频的一种方法

ffmpeg -f concat -i merge_list.txt -c copy output.mp4

其中merge_list.txt格式:

file 'file1.mp4'

file 'file2.mp4'

.

file 'filen.mp4'