ffmpeg 开发
微信视频号的文件下载 :先在微信上打开视频号的东西,深度搜索 Finder,找到大的文件(一般1-几M)就是了。
头条上的视频下载:分画面流和音频流两部分,在Network下看到一大串,下载再合并成mp4
使用 ffmpeg命令下载网络上 blob 协议加密过的.m3u8切片成一个一个的 ts 的视频:ffmpeg -i https://xxxxxx.m3u8 -c copy monv.mp4, 详见
免费下载网站
==========================================
ffmpeg 在Ubuntu下的(编译)安装配置:【ubuntu安装ffmpeg】_噗噗酱_Pooh的博客-CSDN博客_ubuntu安装ffmpeg
手动安装ffmpeg(源码编译):
1. 下载:
wget http://www.ffmpeg.org/releases/ffmpeg-xxx..tar.gz
tar -zxvf ffmpeg-3.1.tar.gz
如果wget访问不到网址,可以先用谷歌浏览器下载,再安装
2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录
cd ffmpeg-xx.xx
./configure --prefix=/usr/local/ffmpeg
make
make install
//执行./configure时,报yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild错误,解决如下:
sudo apt-get install yasm
3.配置环境变量
geidt ~/.bashrc
在最后PATH添加环境变量:
export PATH=$PATH:/usr/local/yasm/bin
source ~/.bashrc
gedit ~/.bashrc
在最后PATH添加环境变量:
export PATH=$PATH:/usr/local/ffmpeg/bin
source ~/.bashrc
方式二:直接命令行下载:sudo apt-get install ffmpeg
==========================================
FFMPEG源码学习教程:
http://dranger.com/ffmpeg/tutorial01.html
containers: 如avi,quicktime
streams : audio stream, video stream(可能多路),是随时间变化的数据元素
frames :data elements in a stream are called frames
codec : 编解码器,defines how the actual data is COded and DECoded,如DivX, MP3
packets : are read from the stream, are pieces of data that can contain bits of data that are decoded into raw frames that we can finally manipulate for our application.每包包含完整的帧,或者一包包含多帧(如音频).
At its very basic level, dealing with video and audio streams is very easy:
10 OPEN video_stream FROM video.avi
20 READ packet FROM video_stream INTO frame
30 IF frame NOT COMPLETE GOTO 20
40 DO SOMETHING WITH frame
50 GOTO 20
ffmpeg为开发者提供的库:
libavutil:包含一系列简化编程的函数,如随机数生成、数据结构、数学计算、核心多媒体实用工具等。
libavcodec:包含音频/视频编解码器。
libavFormat:包含用于多媒体文件格式的封装器和解封装器
libavDevice:可以读取多媒体设备的数据,或者输出数据到指定的多媒体设备上。
libavfilter:包含媒体过滤器。
libswScale:执行高度优化的图像缩放和颜色空间/像素格式转换操作。
libswresSample:执行高度优化的音频重采样、重矩阵和采样格式转换操作。
#if 0
里面的代码不会被编译
#endif
=============================================
DVR:Digital Video Recorder,数字视频录像机或数字硬盘录像机,我们习惯上称为硬盘录像机。
结合标准接口的数字存储介质,采用数字压缩算法,实现音视频信息的数字记录、监视与回放,并可带有系统控制功能的视频设备或视频网络传输与监控的设备(一般带有独有的功能操控面板)
NVR : Network Video Recorder,网络数字硬盘录像机,与DVR的不同点在于,DVR前端是接模拟摄像头,而NVR前端是接网络摄像头;
在图像压缩传输方面,NVR比DVR要清晰的多,可以达到高清,信号传输也比DVR流畅;有些NVR也兼容DVR的功能。
1.音视频基础知识
2.音视频编解码
SurfaceView + AudioTrack + 视频文件,做一个播放器怎么做?需要哪些步骤呢? Opensl es(嵌入式)
RGB : 8字节/通道.24字节, 32字节(RGBA)
YUV : Y黑白电视,亮度; U色度; V饱和度. //HSV
YUV发现比例可以不一样,为什么可以,人眼对亮底比较敏感,对色度没那么敏感。
YUV440 : Y:U:V = 1:1:1
YUV420
YUV444
图像是一行一行交替显示的(第一行2:1:0,第二行2:0:1,...)
H264编解码的思想:认为每一帧每一帧都有相同的数据,我就充分利用这个特性
涉及的算法:研究生博士生基本能搞懂了,有:熵编码,帧内预测,帧间预测,环形滤波
//第一帧的数据量最大,蓝色的,是根据前面一帧来得到的,绿色的是根据两边来得来
补充:H264码流怎么存?一个一个的NALU存起来的,大小是不固定的,一个NALU代表的是一帧画面(办法是在首尾各放一个标志位)
原始音频:PCM
PCM采样:录音机 //查看工具:Adobe_Audition_3.0.exe
音频参数有 :
码率,
声道 : 2声道(左右声道,立体声). 还有5.1环绕声
采样率 :48.0KHz 一秒中采样多少个点,48*1000个点, 44100是人耳最好的采样率//用工具Audition打开后放大,会发现是波浪形的
位深度 :每个声道使用多少位来存储. 有16位,表示16byte存的; 还有8位的. //16位可转成2个8位.
wmv很大,一般是没什么压缩的.
容量计算: 48000 x 60 x 60 x 16 = 30M左右(1小时的音频)
别人的博客,里面很多干货学习: https://blog.csdn.net/leixiaohua1020
GPGPU : 通用计算的GPU,只要一颗GPU用作通用计算的目的,就是GPGPU了.当然专门的有Tesla
ffmpeg 常用命令:
视频转图片:
ffmpeg -i input.mp4 -r 1 -f image2 outs/image-%3d.jpeg
ffmpeg -i input.mp4 -r 30 -f image2 out1/image-%3d.jpeg
ffmpeg -r 30 -i out1/image-%3d.jpeg -crf 25 out1.mp4
ffmpeg -i input.mp4 -vn -acodec copy out.aac
合并音视频: ffmpeg -i out1.mp4 -i out.aac -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output.mp4
ffmpeg.exe -i video去音频版.mp4 -i audio原版.mp3 -vcodec copy -acodec copy 音视频合并版.mp4
图片修改分辨率 : ffmpeg -i "C:\xxxx\input.jpg" -s 1920x960 "C:\xxxx\output.jpg"
视频截取:ffmpeg -i input.mp4 -vcodec copy -acodec copy -ss 00:01:58 -to 00:2:30 output.mp4
视频翻转:ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
0: 逆时针和垂直翻转90度(默认)
1: 顺时针旋转90度
2: 逆时针方向90度
3: 顺时针和垂直翻转90度
旋转180度怎么办?如下:ffmpeg -i in.mov -vf "transpose=2,transpose=2" out.mov
ffmpeg 源码开发:
#logging
av_log_set_level(AV_LOG_DEBUG);
av_log(NULL, AV_LOG_INFO, "Hello ffmpeg! %s %d","AAA", 10);
#move and delete file
int ret;
ret = avpriv_io_move("111.txt", "222.txt");
if(ret < 0){
av_log(NULL, AV_LOG_ERROR, "Failed to rename\n");
return -1;
}
av_log(NULL, AV_LOG_INFO, "Success to rename\n");
ret = avpriv_io_delete();
#操作目录重要函数
ret = avio_open_dir(&ctx, "./", NULL);
ret = avio_read_dir(ctx, &entry);
avio_free_directory_entry(&entry);
avio_close_dir(&ctx);
相应的重要的结构体:
AVIODirContext(操作目录的上下文),
AVIODirEntry(目录项,用于存放文件名,文件大小等信息)
#多媒体文件的基本概念
多媒体文件其实是个容器,里面可以装视频、音频、字幕数据
在容器里有很多流(Stream/Track)
每种流是由不同的编码器编码的
从流中读出的数据称为包
在一个包中包含着一个或多个帧
几个重的的结构体: AVFormatContext(用于区别于另外一个多媒体), AVStream, AVPacket
ffmpeg操作流数据的基本步骤: 解复用->获取流->读数据包->释放资源
av_register_all(); //将ffmpeg中所定义,或所已属知的编解码库,编解码格式协议,各种协议(包括网络协议)注册进来。
avformat_open_input/avformat_close_input(); //打开/关闭一个多媒体文件
av_dump_format(); //将多媒体文件中的meta信息打印出来
抽取音频数据
av_init_packet() //初始化一个数据包结构体
av_find_best_stream() //从多媒体文件中找到我们想要的最好的一路流
av_read_frame()/av_packet_unref() //拿到这路流后,把流中的一个个数据包获取到;不用时,把引用计数减1,释放掉
采样率是 hz,码率是 kb/s
clang -w -g -o mediainfo mediainfo.c `pkg-config --libs libavformat libavutil`
ls -alt #看详细的信息
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
