1. FFmpeg常用命令
1.1 整体流程
1.2 常用命令分类
1.2.1 基本信息查询命令
1.2.2 录制命令
- 录制视频
ffmpeg -f avfoundation -r 30 -i 0 out.yuv
- 录制音频
ffmpeg -f avfoundation -i :0 out.pcm
- 音视频同时录制
ffmpeg -f avfoundation -r 30 -i 0:0 out.mp4
1.2.3 分解/复用命令
ffmpeg -i test.mp4 -c copy test.flv
# 同样的效果
ffmpeg -i test.mp4 -acodec copy -vcodec copy test.flv
ffmpeg -i test.mp4 -c:a copy -c:v copy test.flv
1.2.4 处理原始数据命令
- 抽取视频
ffmpeg -i test.mp4 -an -c:v rawvideo test.yuv
- 抽取音频
ffmpeg -i test.mp4 -vn -ar 44100 -ac 2 -f s16le test.pcm
1.2.5 裁剪/合并命令
- 裁剪命令
ffmpeg -i test.mp4 -ss 00:00:01 -t 10 test_ss1.mp4
- 合并命令
#input.txt文件
file 'test_ss1.mp4'
file 'test_ss2.mp4'
#合并命令
ffmpeg -f concat -i input.txt test_cc.mp4
1.2.6 视频/图片转换命令
- 视频转图片
ffmpeg -i test.mp4 -f image2 image_%3d.jpeg
- 图片转视频
ffmpeg -i image_%3d.jpeg test_img.mp4
1.2.7 直播相关命令
- 拉流
ffmpeg -i rtmp://58.200.131.2:1935/livetv/cctv1 -c copy test_rtmp.mp4
- 拉流
ffmpeg -re -i test_rtmp.mp4 -c copy -f flv rtmp//:localhost/live/room
1.2.8 滤镜相关命令
裁剪画面
ffmpeg -i test.mp4 -vf crop=in_h-400:in_w-900 test_crop.mp4
2. FFmpeg初级使用
2.1 文件操作
void ffmpeg_test() {
av_log_set_level(AV_LOG_DEBUG);
AVIODirContext *dir_ctx = NULL;
AVIODirEntry *next = NULL;
//打开目录
avio_open_dir(&dir_ctx, "/Users/mac/AVTest", NULL);
//获取目录信息
int count = 0;
while (avio_read_dir(dir_ctx, &next)) {
//打印目录信息
if(!next) {
break;
}
av_log(NULL, AV_LOG_DEBUG, "%s %lld\n", next->name, next->size);
}
//删除文件
avpriv_io_delete("/Users/mac/AVTest/test.flv");
//重命名文件
avpriv_io_move("/Users/mac/AVTest/test.pcm", "/Users/mac/AVTest/tt.pcm");
}
2.2 抽取音频
- 相关API
//输出文件的流信息
void av_dump_format(AVFormatContext *ic,
int index,
const char *url,
int is_output);
//找到最合适的流数据
int av_find_best_stream(AVFormatContext *ic,
enum AVMediaType type,
int wanted_stream_nb,
int related_stream,
AVCodec **decoder_ret,
int flags);
- 实例
void cut_audio() {
AVFormatContext *fmt_ctx = NULL;
const char *src_path = "/Users/mac/AVTest/test.mp4";
const char *dst_path = "/Users/mac/AVTest/test.aac";
FILE *dst_fd = NULL;
AVPacket *packet NULL;
int ret = -1;
/*输出文件的信息*/
avdevice_register_all();
//打开音频文件
avformat_open_input(&fmt_ctx, src_path, NULL, NULL);
av_dump_format(fmt_ctx, 0, src_path, 0);
//选择最合适的流
ret = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_AUDIO, -1, -1, NULL, 0);
//读取数据流
dst_fd = fopen(dst_path, "wb+");
packet = av_packet_alloc();
av_init_packet(packet);
while (0 == av_read_frame(fmt_ctx, packet)) {
//转存入文件
char szAdtsHeader[ADTS_HEADER_LEN] = {0};
adts_header(szAdtsHeader, packet->size);
fwrite(szAdtsHeader, 1, ADTS_HEADER_LEN, dst_fd);
fwrite(packet->data, 1, packet->size, dst_fd);
}
fclose(dst_fd);
avformat_close_input(&fmt_ctx);
av_packet_free(&packet);
}