基于ffmpeg的编码(FFmpeg将文件转码成MP4格式)
基于ffmpeg的编码(FFmpeg将文件转码成MP4格式)Input #0 mpegts from 'benben.ts':Duration: 00:00:10.19 start: 1.462011 bitrate: 635 kb/sProgram 1Metadata:service_name : Service01service_provider: FFmpegStream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B) yuv420p 368x640 [SAR 45:46 DAR 9:16] 24 fps 24 tbr 90k tbn 48 tbcStream #0:10x101: Audio: aac (LC) ([15][0][0][0] / 0x000F) 48000 Hz stereo fltp 67 kb/s[mp4 @ 0
前言MP4 格式的视频文件在日常工作和生活中很常见,今天我们来看看 FFmpeg 如何将一个视频文件转换成 MP4 格式。
正文在点播领域,mp4格式应该是最常见的多媒体文件封装格式。我们需要知道,mp4文件是由许多Box和FullBox组成的,其中,每个Box由header和data两部分组成。FullBox是Box的扩展结构,在header中增加了8位version标志和24位的flags标志。
Box和FullBox中的header部分包含了整个Box的长度大小和类型,data部分是存储的实际数据,有可能是数据,也有可能是嵌套的Box(那么此时这个Box会被称为容器)。
好了,大概了解mp4的结构之后,我们来使用ffmpeg将一个ts(或者flv)源文件转换成mp4文件,运行如下命令:
ffmpeg -i benben.ts -c copy -f mp4 benben2.mp4
【更多音视频学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
音视频开发基础知识和资料包
运行结果如下:
Input #0 mpegts from 'benben.ts':
Duration: 00:00:10.19 start: 1.462011 bitrate: 635 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (High) ([27][0][0][0] / 0x001B) yuv420p 368x640 [SAR 45:46 DAR 9:16] 24 fps 24 tbr 90k tbn 48 tbc
Stream #0:10x101: Audio: aac (LC) ([15][0][0][0] / 0x000F) 48000 Hz stereo fltp 67 kb/s
[mp4 @ 02eac480] Codec for stream 0 does not use global headers but container format requires global headers
[mp4 @ 02eac480] Codec for stream 1 does not use global headers but container format requires global headers
Output #0 mp4 to 'benben2.mp4':
Metadata:
encoder : Lavf56.40.100
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021) yuv420p 368x640 [SAR 45:46 DAR 9:16] q=2-31 24 fps 24 tbr 90k tbn 90k tbc
Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040) 48000 Hz stereo 67 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop [?] for help
[mp4 @ 02eac480] Malformed AAC bitstream detected: use the audio bitstream filter 'aac_adtstoasc' to fix it ('-bsf:a aac_adtstoasc' option with ffmpeg)
av_interleaved_write_frame(): Operation not permitted
frame= 6 fps=0.0 q=-1.0 Lsize= 84kB time=00:00:00.14 bitrate=4700.5kbits/s
video:83kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.068532%
Conversion failed!
运行结果报错了:
报错信息提示我们应该设置音频转化模式,修改后运行如下命令:
ffmpeg -i benben.ts -c copy -bsf:a aac_adtstoasc -f mp4 benben2.mp4
输出结果:
[mp4 @ 0547f420] Codec for stream 0 does not use global headers but container format requires global headers
[mp4 @ 0547f420] Codec for stream 1 does not use global headers but container format requires global headers
Output #0 mp4 to 'benben2.mp4':
Metadata:
encoder : Lavf56.40.100
Stream #0:0: Video: h264 ([33][0][0][0] / 0x0021) yuv420p 368x640 [SAR 45:46 DAR 9:16] q=2-31 24 fps 24 tbr 90k tbn 90k tbc
Stream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040) 48000 Hz stereo 67 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop [?] for help
frame= 244 fps=0.0 q=-1.0 Lsize= 707kB time=00:00:10.06 bitrate= 575.9kbits/s
video:620kB audio:79kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.147096%
文件转换成功了:
最后,用mp4info查看一下目标视频文件的组成结构:
【更多音视频学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
音视频开发基础知识和资料包
在使用ffmpeg转换flv文件时,需要根据具体的使用场景修正参数,出现报错不要慌。通过分析具体的报错原因,有的放矢,我们一定可以搞定,Good luck!
如果你对音视频开发感兴趣,觉得文章对您有帮助,别忘了点赞、收藏哦!或者对本文的一些阐述有自己的看法,有任何问题,欢迎在下方评论区讨论!