FFMPEG 命令行常用方法示例(包括yuv处理相关命令)

转载https://blog.csdn.net/soaringlee_fighting/article/details/80571673

1、引言
FFMPEG以其强大的功能而在音视频领域著称,更重要的是它还是开源的!音视频格式转换、裁剪、拼接、提取字幕或某音轨等等,它都能胜任,可谓一把瑞士军刀,小巧但功能强大,是音视频研究的必备利器之一。

2、常用命令示例
1、 转换成H264码流

ffmpeg -i input_file -vcodec h264 output_file  
1
其中 -i 表示输入文件, -vcodec h264 表示视频编解码方式为 H264。

2、 转换成H265码流

ffmpeg -i input_file -vcode hevc output_file  
1
其中 -i 表示输入文件, -vcodec hevc 表示视频编解码方式为 H265,注意ffmpeg 中名称为 hevc,不是H265!

3、 设置输出视频的分辨率

ffmpeg -i input_file -vcodec h264 -s 1280x720 output_file
1
其中 -s 表示分辨率。

4、设置输出文件的音视频比特率

ffmpeg -i input_file  -vcodec h264 -b:v 10M -b:a 128K output_file
1
其中 -b:v 10M 表示视频码率为10Mbps, -b:a 128K 表示音频码率为 128Kbps,注意FFMPEG对于码率控制,有时候不太准确,跟输入源有一定关系。

5、 剪切某段视频

ffmpeg -ss 0:05:00 -t 0:1:30 -i input_file -vcodec copy -acodec copy output_file  
ffmpeg -ss 300 -t 90  -i input_file -vcodec copy -acodec copy output_file 
1
2
上面的两种方式等价,时间格式支持 HH:MM:SS或者秒数。 -ss 开始时间, -t 持续时间, -vcodec copy 保持原视频编码方式, -acodec copy 保持原音频编码方式。

注意:-vcodec copy与-c:v以及-codec:v 这三种写法的功能是一样的,具体可参考:
https://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-February/035335.html

6、 分离音视频流保存为不同文件

ffmpeg -i input_file -vcodec copy -an output_file_video //提取视频流 
ffmpeg -i input_file -acodec copy -vn output_file_audio //提取音频流
1
2
其中 -an 表示不处理音频, -vn 表示不处理视频。

7.合并多个音视频文件为一个文件

ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file 
1
8、提取视频图像保存为图片文件(将视频分解为单幅图片)

ffmpeg –i input_file –r 1 –f image2 image-%3d.jpeg        //提取图片
1
其中 -r 表示提取图像的频率,-f 表示输出格式, %3d 表示文件命名方式(也即生成的图片名为 image-001.jpeg, image-002.jpeg, …, image-999.jpeg)。

9、 转换成YUV原始文件

ffmpeg -i input_file -vcodec rawvideo -an output_file_yuv
1
10、YUV序列转出AVI文件

ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi 
1
11、控制关键帧间隔和B帧

ffmpeg –i input_file  –vcodec h264 –bf 0 –g 25 –s 854x480 –an –f m4v output_file
1
其中-bf 控制B帧数目,-g 控制关键帧间隔, -f 控制文件格式(format,注意与codec的区别)。

12、 多个视频文件拼接

首先创建一个需要拼接的文件,例如 concat.txt,内容如下:

file ‘orig_20160616113303_0.avi’
file ‘orig_20160616113303_1.avi’

然后执行如下命令

ffmpeg  -f concat -i concat.txt  -c copy orig_20160616113303_merge.avi 
1
3、YUV处理相关命令(持续更新ing)
1、查看ffmpeg支持哪些yuv格式的转换

ffmpeg -pix_fmts  
1
2、ffmpeg转换yuv格式命令

ffmpeg -pix_fmt yuv420p -s 176x144 -i carphone_qcif.yuv -pix_fmt nv12 carphone_qcif_nv12.yuv  
1
3、ffmpeg命令行yuv缩放命令

ffmpeg -s:v 1920x1080 -r 25 -i input.yuv -vf scale=960:540 -c:v rawvideo -pix_fmt yuv420p out.yuv  
1
4、ffmpeg解码码流命令

ffmpeg -i 720P.264 -s 1280x720 -pix_fmt yuv422p 720P-out.yuv  
简化版:ffmpeg -i 720P.264 720P-out.yuv
1
2
5、ffmpeg yuv转avi

ffmpeg -s wxh -pix_fmt yuv420p -i input.yuv -vcodec mpeg4 output.avi  
ffmpeg -s wxh -pix_fmt yuv420p -i input.yuv -vcodec h264 output.avi  
1
2
6、ffmpeg 裸码流转avi

ffmpeg -f h264 -i source.264 -c:v libx264 -an dest.avi
Use -c:v copy instead to copy the source stream without re-encoding
1
2
参考网址:https://stackoverflow.com/questions/33108985/ffmpeg-264-to-avi
7、ffmpeg avi转裸码流

 7.1 提取裸码流

ffmpeg.exe -i BQSquare_416x240_37.avi -f rawvideo -vcodec copy xx.264
1
 7.2 提取若干帧数码流

ffmpeg.exe -i BQSquare_416x240_37.avi -f rawvideo -vcodec copy -vframes 100 xx.264
1
对于提取特定的帧,需要用特殊的方法:假设提取260帧,帧率是26, 则可用-ss 10.0 其中10.0=260/26
8、YUV裁剪功能
Extract some YUV frames from large yuv File
从第0帧开始截取30帧:

ffmpeg -s widthxheight -i input.yuv -c:v rawvideo -filter:v select="gt(n\, -1)" -vframes 30 out30.yuv
1
或者:

ffmpeg -s widthxheight -i input.yuv -c:v rawvideo -filter:v select="between(n\, 0\, 29)" out30.yuv
1
或者:

ffmpeg -r 1 -ss 0 -i input.yuv -vcodec copy -vframes 30 output.yuv
1
中间截取帧(截取从第30帧到第100帧):

ffmpeg -s widthxheight -i input.yuv -c:v rawvideo -filter:v select="between(n\, 30\, 100)" out.yuv
1
根据时间截取帧(截取从第10秒到第20秒 ):

//Select only frames contained in the 10-20 time interval:
//select=between(t\,10\,20)
ffmpeg -s widthxheight -i input.yuv -c:v rawvideo -filter:v select="between(t\, 10\, 20)" out.yuv
1
2
3
参考自: https://blog.csdn.net/listener51/article/details/82025541

4、FFMPEG常用参数说明
主要参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
-formats 查看所有支持的容器格式
-codecs 查看所有编解码器
-filters 查看所有可用的filter
-pix_fmts 查看所有支持的图片格式
-sample_fmts 查看所有支持的像素格式
-i input_file 查看媒体文件input_file的信息(注意后面不再接其它参数,例如: ffmpeg -i test.mp4,查看 test.mp4视频信息)

视频参数:
-b 设定视频流量,默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器

音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频

5、小结
 ffmpeg功能强大,参数配置众多,最好的方式查看它的命令行帮助文档,各个参数都有详细的说明,唯一的遗憾就是没有例子,对于初入媒体领域的人来说,门槛比较高。不明白的参数,可以多试试,再接合MediaInfo工具查看具体信息,通过VLC或者FFMPEG自带的 ffplay播放器播放,就容易理解了。

6、文档参考
官网翻译文档:https://www.bookstack.cn/read/other-doc-cn-ffmpeg/ffmpeg-doc-cn-40.md
官方ffmpeg命令行参考文档:http://ffmpeg.org/ffmpeg.html

更多ffmpeg命令使用可参考:
http://processors.wiki.ti.com/index.php/Open_Source_Video_Processing_Tools_-_MPlayer,_FFMpeg,_AviSynth,_MKVToolnix,_MP4Box#Downloads
http://ffmpeg.org/ffmpeg-filters.html#aselect_002c-select
https://lists.ffmpeg.org/pipermail/ffmpeg-user/2017-February/035335.html
https://www.bookstack.cn/read/other-doc-cn-ffmpeg/ffmpeg-doc-cn-40.md
https://blog.csdn.net/SoaringLee_fighting/article/details/56015567
https://www.suninf.net/2017/02/ffmpeg-command-usage.html

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用FFmpeg可以将视频或音频编码为byte数组。以下是一个示例命令行: ``` ffmpeg -i input.mp4 -f rawvideo -pix_fmt yuv420p - | xxd -p > output.bin ``` 该命令将输入的MP4文件转换为YUV420P格式的原始视频,并将其输出到标准输出流。然后使用`xxd`命令将输出的二进制数据转换为十六进制字符串,并将其重定向到文件`output.bin`中。 你可以使用Java中的`ProcessBuilder`类来执行此命令并读取输出的结果。以下是一个示例Java代码: ```java import java.io.IOException; import java.io.InputStream; import java.util.Arrays; public class FFmpegEncoder { public static byte[] encode(String inputFile) throws IOException, InterruptedException { ProcessBuilder builder = new ProcessBuilder( "ffmpeg", "-i", inputFile, "-f", "rawvideo", "-pix_fmt", "yuv420p", "-" ); builder.redirectErrorStream(true); Process process = builder.start(); InputStream inputStream = process.getInputStream(); byte[] buffer = new byte[1024]; int bytesRead; ByteArrayOutputStream output = new ByteArrayOutputStream(); while ((bytesRead = inputStream.read(buffer)) != -1) { output.write(buffer, 0, bytesRead); } int exitCode = process.waitFor(); if (exitCode != 0) { throw new RuntimeException("FFmpeg exited with error code " + exitCode); } return output.toByteArray(); } public static void main(String[] args) throws IOException, InterruptedException { byte[] encodedData = encode("input.mp4"); System.out.println(Arrays.toString(encodedData)); } } ``` 该代码使用`ProcessBuilder`执行FFmpeg命令,并从输出流读取编码后的数据。它将这些数据存储在一个字节数组中,并将其打印到控制台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值