ffmpeg 将1张图片和1个MP3音频文件转为MP4

公司项目需求要将1张图片和1个mp3音频文件合成转为MP4,在html5上播放,原以为是很简单的一回事,所以很快就写了一条简单的ffmpeg命令去执行。

ffmpeg -i 2.mp3 -f image2 -i 3.jpg -acodec aac -strict -2 -vcodec libx264 -ar 22050 -ab 128k -ac 2  -y 4.mp4

一开始非常顺利,合成的MP4能够在html5上播放,但问题来了,当换了一张图片的时候,就发现不能播放了,总提示视频格式不正确。之后我又换了好多图片尝试,有些成功有些不成功。

我点击右键查看图片属性,各样参数都是相同的,同样是.jpg,同样是300px*300px,同样是96dpi。

查了好久没查出原因,最后,用ffmpeg查看图片参数才发现问题。

ffmpeg查看图片参数命令 ffmpeg -i 3.jpg

相对比下,发现当中有一个参数不同,就是yuvj420p。

YUV主要的采样格式
    主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值), 每 2x2 个点保存一个 Cr 和Cb 值, 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 4 个点需要 8x3=24 bites(如下图第一个图)。 而现在仅需要 8+(8/4)+(8/4)=12bites, 平均每个点占12bites(如下图第二个图)。这样就把图像的数据压缩了一半。
    上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:
    (1)    YUV 4:4:4
    YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。
    下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
    存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
    (2)   YUV 4:2:2
    每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存。
    下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
    存放的码流为: Y0 U0 Y1 V1 Y2 U2 Y3 V3
    映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
    (3)   YUV 4:1:1
    4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存
    下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
    存放的码流为: Y0 U0 Y1 Y2 V2 Y3
    映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
    (4)YUV4:2:0
    4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。进行隔行扫描,相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0…以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。

最后,将ffmpeg视频转换命令加上设置yuvj420p的参数

ffmpeg -i 2.mp3 -f image2 -i 3.jpg -acodec aac -strict -2 -vcodec libx264 -ar 22050 -ab 128k -ac 2 -pix_fmt yuvj420p -y 4.mp4

转码出来的mp4就ok了。

时间: 2024-12-07 00:49:58

ffmpeg 将1张图片和1个MP3音频文件转为MP4的相关文章

mac下压缩mp3音频文件/linux 适用

为了压缩一个软件煞费苦心,最终还是没有找到一个不要钱的gui工具,郁闷之余,另辟思路,何不采用linux的命令行工具去压缩啊,于是在网上找到了这个工具lame 首先当然是用 homebrew 来安装lame dangchengchengdeMacBook-Pro:js dangchengcheng$ brew install lame ==> Downloading https://homebrew.bintray.com/bottles/lame-3.99.5.yosemite.bottle.

工业串口触摸屏开发制作mp3播放器,单片机或PLC通过串口控制播放MP3音频方法

在工业控制系统中将音乐或语音MP3的美和工控结合在一起,给人以赏心悦目的感受.随着工业控制的发展,对工业控制的控制要求也越来越高,使得越来越多的控制部分不是指简单的现场控制,还需要增加音乐播放或语音提示,使得控制系统更加人性化. 这里介绍广州易显的工业串口触摸屏或者ARM工控机连接单片机或者PLC,使用工业串口触摸屏开发制作mp3的方法.跟电脑的播放器一样,具有播放,暂停,停止,控制播放进度,上一首,下一首等功能.可以在人机界面上控制播放MP3音乐或者语音提示.也可以使用单片机或PLC控制播放的

HTML5 audio 如何实现播放多个MP3音频

<audio>标签是HTML5中的新标签,定义声音用于嵌入音频内容,比如音乐或其他音频流.用的比较多音频格式是.mp3. <audio>标签常用属性如下表 属性 值 描述 autoplay autoplay 添加该属性后,音频会自动播放 controls controls 设置后,显示控件,如播放按钮.音量 loop loop 添加该属性后,当音频播放结束后会重新开始播放 preload preload 音频显示页面加载,准备播放,如已添加autoplay,则忽略该属性 src u

编译安装FFmpeg 要支持xvid、x264、mp3、ogg、amr、faac

编译安装FFmpeg 要支持xvid.x264.mp3.ogg.amr.faac libfaac    faac格式的编解码包libmp3lame    mp3格式编解码包libopencore-amrwb libopencore-amrnb    amr格式编解码包libx264    x264格式编解码包libvorbis    ogg格式编解码包libxvid    xvid格式编解码包 开始安装(有些包下载可能需要FQ)faacwget http://softlayer-dal.dl.s

python处理音频文件(mp3)

今天aiping点读笔的MP3源文件出现声音大小不一致,而且需要将英文单词MP3与单词翻译MP3文件连接起来,刚开始使用ffmpeg效果很差.万能的gitgub再次证明了它的万能,我找到了pydub 1 网址:https://github.com/jiaaro/pydub 2 pydub需要依赖 libav或者ffmpeg 3 在mac环境下安装依赖:(二选一) brew install libav --with-libvorbis --with-sdl --with-theora 将所有依赖都

PHP 将amr音频文件转换为mp3格式

说下整体思路 1.服务器安装ffmpeg 2.使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可) 3.在网页端使用HTML5的audio标签来播放mp3文件 下面是操作细节: 一.服务器安装ffmpeg以cenos为例 此处参考:http://my.oschina.NET/ethan09/blog/372435 需要特别注意的是,在下面的方法中,amrnb和amrwb的安装到make环节会请求3gp的一个网址,一般是请求不到的,可以用cr

简单mp3音频播放器的实现

本篇主要介绍使用Mediaplayer实现mp3简易音乐播放器,程序运行界面如下 下面是代码实现,因为代码比较简单,注释已经比较明确了. public class PlayActivity extends Activity implements OnClickListener { private EditText filenameText; // 音频播放的主要类 private MediaPlayer mediaPlayer; private String filename; // 记录播放位

ffmpeg+libx264+facc交叉编译 实现264流录制avi文件

默认交叉编译器已经搭建好............... 需求: 把标准的h264流保存成avi格式的实现文件,所以需要h264的解码器,avi文件容器,传输协议类型是文件,这些会体现在ffmpeg的configure配置上--disable-everything --enable-protocol=file --enable-encoder=libx264 --enable-encoder=libfaac --enable-libx264 --enable-gpl --enable-libfaa

CEF3 HTML5 audio标签为什么不能播放mp3格式的音频文件

CEF3 HTML5 audio标签 为什么不能播放mp3格式的音频文件 原因略. 解决方法: 找一个最新版的chrome ,我用的是24版本.路径 C:\Documents and Settings\guo\Local Settings\Application Data\Google\Chrome\Application\24.0.1312.57的下面有一个文件ffmpegsumo.dll. 复制出来,替换掉CEF3的同名文件.就好了.