zoukankan      html  css  js  c++  java
  • 音视频入门-4-ffmpeg命令快速体验音视频开发/ ffmpeg编译过程经历的99八十一难

     

    1》我的实验所使用的视频文件告知读者

    1.

     

    这是我在ubuntu环境上实验使用的视频文件, 我在windows上查看了详细信息,然后拖进ubuntu内,重命名为video-test.mp4

     

    2.

    这是我在windows环境上实验使用的视频文件

     

    2》开始实验

    <1>播放音频

    -window_title LMW:窗口名起名为-window_title LMW:窗口名起名为LMW

    -loop 2:循环播放两次

    -autoexit:播放完毕后自动退出

    ffplay -window_title myplayer -loop 2 -autoexit hello.wav  (windowsLinux实测适用)

     

     

    <2>播放视频  

    ffplay test.mp4  (windowsLinux实测适用)

    结束播放后,可以看到相关的视频参数:

    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 206 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc (default)

    这显示该视频详细信息为h264编码,格式为yuv420p, 分辨率为1280x720, 码流为206kb/s等。

     

    <3>以固定窗口大小播放视频  -autoexit:播放完毕后自动退出

    ffplay -x 640 -y 480 -autoexit test.mp4  (windowsLinux实测适用)

     

    -window_title LMW:窗口名起名为LMW

    ffplay -window_title LMW -x 640 -y 480 -autoexit  test.mp4 (windowsLinux实测适用)

     

    <4>视频转码  -an: audio not 不需要音频,剔除音频

    ffmpeg -i test.mp4 -an -c:v rawvideo -pix_fmt yuv420p out.yuv (windowsLinux实测适用)

    下面截图来自ubuntu上的实验

     

    PS:文件大小比对

    原视频13.8MB

    out.yuv达到了惊人的近500MB,而且不含音频信息。

    所以说,音视频文件需要编码啊,降低文件大小同时又保持高画质,很必要。

     

    <5>播放yuv420p格式的视频:out.yuv, 此时需要指定其正确的视频分辨率,否则不能正常显示该视频

    ffplay -pix_fmt yuv420p -s 1280x720 out.yuv (windows实测有效)

     

    ffplay -pix_fmt yuv420p -s 1080x1920 out.yuv (Linux实测有效,注意,这里1080在前面,1920在后面)  

    或者

    ffplay -pix_fmt yuv420p -s 1080x1920  -x 640 -y 320 -window_title LMW -autoexit out.yuv

    (Linux实测有效,注意,这里1080在前面,1920在后面)

     

     

    <6>只提取y分量并播放该视频,视频变成了黑白电视的效果

    -vf: 简单滤波器

    ffplay -s 1280x720 -vf extractplanes='y' out.yuv

     

     

    <7>只提取u分量并播放该视频

    ffplay -s 1280x720 -vf extractplanes='u' out.yuv

     

     

    <8>只提取v分量并播放该视频

    ffplay -s 1280x720 -vf extractplanes='v' out.yuv

     

    <9>录制音频

    mac:

    ffmpeg -f avfoundation -i:0 out.wav

     

    windows:

    chcp 65001    

    敲入该命令,使得windowscmd命令提示符窗口可以正确显示出中文 UTF-8

     

    ffmpeg -list_devices true -f dshow -i dummy

    执行该指令,然后查看 DirectShow video devices ,会列出音频设备和视频设备的名字

     

    ffmpeg -f dshow -i audio="麦克风阵列 (Realtek Audio)" -acodec libmp3lame test.mp3

    录制音频,按下ctrl+c可以结束录制音频

     

    ffmpeg -f dshow -i video="HD User Facing" -t 10 -vcodec libx264 test.mp4  

            录制10秒钟的视频,采用H264编码,保存为文件。 video=XXXX是上面ffmpeg -list_devices查看到的视频设备的名字

     

        参考【window系统 实现FFmpeg 录制音视频-CSDN博客】

    https://blog.csdn.net/david_jiahuan/article/details/103634013

     

    Linux

    方式1

    arecord -D plughw:0,0 -f S16_LE -c 2 -r 22050 out.wav  

    这个没使用ffmpeg,使用了alsaarecord ALSA声卡驱动程序的命令行声音文件记录器

     

    方式2

    ffmpeg -f alsa -ac 2 -i hw:0,0 out.avi 

    ffplay out.avi

    使用ffmpeg方式录制音频,不过我使用笔记本录制,音量很小。

     

    <10> 录制屏幕

    Linux

    方式1 实测有画面没声音

    ffmpeg -f x11grab -r 30 -i :0.0 -f alsa -i hw:0,0 -acodec flac -vcodec ffvhuff out.mkv  // 采用mkv格式

    ffplay out.mkv

     

    方式2 实测有画面没声音

    ffmpeg -s 800x600 -r 25 -f x11grab -i :0.0 -f alsa -ac 2 -ar 44100 -i pulse -qscale 0.01 output.flv

    ffplay output.flv

     

    方式3 实测有画面没声音 而且分辨率设置太大,画面会不清晰

    ffmpeg -s 1688x966 -r 25 -f x11grab -i :0.0 -f alsa -ac 2 -ar 44100 -i pulse -t 60 test.mp4

     

    <11> 录制摄像头视频

    Linux:

    实测有画面有声音,但是播放时音视频不同步

    ffmpeg -f alsa -i default -f v4l2 -s 1024x768 -i /dev/video0 -acodec flac -vcodec ffvhuff out.mkv

    ffplay -window_title LMW_Family -autoexit out.mkv

     

    音视频都有,且播放同步

    待探索

     

    《3》ubuntu 64位 环境下编译 ffmpeg:

    1 官网下载源文件压缩包,解压,进入到解压后的文件夹ffmpeg

     

     

    2 配置编译脚本

     可以执行./configure --help查看帮助信息。

     例如我想知道如何进行使能音频操作的配置,执行./configure --help | grep aac 即可查询到需要进行的配置是 --enable-libfdk-aac

    敲入如下配置参数:

    ./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --disable-static --enable-shared --enable-libx264 --enable-filter=delogo --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libopus

     可以看到此时出现了报错:yasm太老了,  但是我们可以使用--disable-x86asm参数解决该报错,make 、make install, 然后这样得到的只是一个crippled build, 即功能残缺的编译。

     我们不想要功能残缺的,所以我们必须解决yasm太老的问题。

     

    3 安装yasm

    http://www.tortall.net/projects/yasm/releases/

    我当前使用的是ubuntu系统,所以选择下载了一个tar.gz版本

     

    之后解压,进入解压后的文件夹

    ./configure --prefix=/home/lmw/MINE/ffmpeg/yasm_steup_here

    make 

    make install

    这样就安装好了yasm。

    最后添加至环境变量

     

    4

    我们再回头,try agian ,重新配置下ffmpeg 的configure脚本,

    又遇到ERROR:libfdk_aac not found

    现在我们面临的是编译过程中遇到的第二个问题,调整好心态,经过百度,我有了解决方案,下面开始:

    下载fdk-aac

    https://sourceforge.net/projects/opencore-amr/files/fdk-aac/

    下载后拖进ubuntu,解压,进入解压后的文件夹

    ./configure

    make

    make install

    这样就解决了我们面临的第二个问题了。

     

    5

    我们再次 try agian ,重新配置下ffmpeg 的configure脚本,

    好吧,很无奈,但是也没办法,我们现在遇到了面临的第三个报错。

    opus是啥呢,重要吗?

    看来是音频编解码相关,所以我们必须要解决这第三个报错。

    下载opus

     https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz

    5.1     ./configure --prefix=/home/lmw/MINE/ffmpeg/opus_stup_here

    5.2     make

    5.3     make install

    5.4     将/home/lmw/MINE/ffmpeg/opus_stup_here/include/opus 拷贝到系统的/usr/include/下

              将 /home/lmw/MINE/ffmpeg/opus_stup_here/lib/* 拷贝到系统的/usr/lib/下

     

    6.

    我们再次 try agian

    挺高兴的,这是我们遇到的第四个错误。为什么高兴呢?因为之前在百度解决之前三个报错的时候,我就顺带看到了这个libx264的报错,说明大家都遇到了这个问题,

    侧面说明咱们的编译ffmpeg的进展之路还是蛮顺利的。

    接着来解决这第四个报错:

    6.1 下载x264安装包

         https://www.videolan.org/developers/x264.html

      本来的理想步骤是下面这样,一路执行下去就安装完事了。

     cd x264-master
     make uninstall
     make distclean
     ./configure --enable-static --disable-opencl
     make
     make install
    但是在执行./configure --enable-static --disable-opencl这句配置时,又遇到了问题

    而这个汇编器是需要的,我们必须解决这个问题。 ps: 这是遇到的第5个问题了, 保持淡定。

     

    6.2 下载nasm

    https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/

    解压:tar -jxvf nasm-2.13.03.tar.bz2

    cd nasm-2.13.03

    ./configure

    make

    make install

     

    安装完成nasm之后再重新进入x264-master目录下执行6.1的步骤:

     make uninstall
     make distclean
    ./configure --enable-static --disable-opencl

        

     现在执行完以后提示我们可以make啦,很开心,哈哈
    make make install

    贴个图,现在x264也搞定了

     

    7.

    我们再次 try agian

    没遇到报错,看来ffmpeg的配置这步已经搞定了。

     

    之后

    make -j4

    重装下libx264试试,环境安装这事情,有些事也说不准,多试试

    这就重装好了。

    8. 再次try  again

    ./configure --prefix=/usr/local/ffmpeg --enable-debug=3 --disable-static --enable-shared --enable-libx264 --enable-filter=delogo --enable-gpl --enable-libfdk-aac --enable-nonfree --enable-libopus

    如下图:

    make

     现在好了,make顺利了

    make install

    一切顺利, ffmpeg就算编译安装好了。

    最后可以看到我们指定的ffmpeg的按量路径下有了bin文件夹,进入到bin文件夹我们看到了三个程序。

    将下面的三个程序所在的全路径,添加至系统环境变量内

    9. 最后进行几波测试

    9.1 测试1

    解决方法:

    需要配置环境变量:

    vim.tiny /etc/ld.so.conf

    在文件中添加如下的路径:
    /usr/local/ffmpeg/lib

    保存后,更新环境变量

    ldconfig

    再次测试播放: 

    ffplay -x 640 -y 480 -autoexit video-test.mp4 

    测试正常,有画面有声音

    PS: 最好将声卡和摄像头都连接至ubuntu内

    9.2 测试2

    ffmpeg -i video-test.mp4 -vn -c:a libfdk_aac -ar 44100 -channels 2 -profile:a aac_he_v2 3.aac

    测试播放提取出来的音频文件也成功了。

    --------------------------------------------------------

    编写本博文查阅过的参考文章,在此表示感谢

    1. Ubuntu下opus的安装及使用

        https://blog.csdn.net/chidaoqi1607/article/details/106260048/

    这篇文章内还提供了一个PCM音频编解码的程序示例,在编译好ffmpeg后,我们可以实测体验一下该程序跑起来的效果。

    2. ERROR:libfdk_aac not found

      https://blog.csdn.net/longbei9029/article/details/79402504

    3. Found no assembler Minimum version is nasm-2.13 If you really want to compile without asm, configure with --disable-asm. 

         https://blog.csdn.net/qq_39759656/article/details/80776550

    4.

            https://www.it610.com/article/1279155905220329472.htm

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    错误:CS0234: 命名空间“System”中不存在类型或命名空间名称“Linq”的解决方法
    DotNetNuke中Membership Provider机制
    解决异常“SqlParameterCollection 只接受非空的 SqlParameter 类型对象。”
    使用 Membership.ValidateUser(Login1.UserName, Login1.Password)验证用户
    布隆过滤器应用
    Paxos在大型系统中常见的应用场景(转)
    淘宝MapReduce作业特性分析(转)
    淘宝Hadoop集群的概况(转)
    内核模块管理(转)
    Centos启动流程(转)
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/14256260.html
Copyright © 2011-2022 走看看