ffmpeg提取视频文件中的多轨音频

时间:2024-04-15 09:51:34
 
1.ffmpeg提取多轨视频中的音频
a).先用ffmpeg查看视频文件信息
  1. # ffmpeg -i "冰雪奇缘BD双语双字.mkv"  
  2. ffmpeg -i "冰雪奇缘BD双语双字.mkv"
    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 -f mp3 -vn a.1.mp3   
  2. ffmpeg -i 冰雪奇缘BD双语双字.mkv -map 0:2 -b:a 64k -f mp3 -vn a.2.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\'