写点什么

FFmpeg[5] - 将视频文件转码成 MP4 格式(FFmpeg 转封装 2)

作者:liuzhen007
  • 2021 年 11 月 19 日
  • 本文字数:1688 字

    阅读完需:约 6 分钟

FFmpeg[5] - 将视频文件转码成MP4格式(FFmpeg转封装2)

目录

前言

正文

总结


前言

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/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 @ 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 headersOutput #0, mp4, to 'benben2.mp4':Metadata:encoder         : Lavf56.40.100Stream #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 tbcStream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 67 kb/sStream 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 permittedframe=    6 fps=0.0 q=-1.0 Lsize=      84kB time=00:00:00.14 bitrate=4700.5kbits/svideo: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 headersOutput #0, mp4, to 'benben2.mp4':Metadata:encoder         : Lavf56.40.100Stream #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 tbcStream #0:1(eng): Audio: aac ([64][0][0][0] / 0x0040), 48000 Hz, stereo, 67 kb/sStream mapping:Stream #0:0 -> #0:0 (copy)Stream #0:1 -> #0:1 (copy)Press [q] to stop, [?] for helpframe=  244 fps=0.0 q=-1.0 Lsize=     707kB time=00:00:10.06 bitrate= 575.9kbits/svideo:620kB audio:79kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.147096% 

文件转换成功了:



最后,用 mp4info 查看一下目标视频文件的组成结构:



总结

在使用 ffmpeg 转换 flv 文件时,需要根据具体的使用场景修正参数,出现报错不要慌。通过分析具体的报错原因,有的放矢,我们一定可以搞定,Good luck!


如果有问题,欢迎评论留言或者私信沟通! 

作者简介:大家好,我是 liuzhen007,是一位音视频技术爱好者,同时也是 CSDN 博客专家、华为云社区云享专家、签约作者,欢迎关注我分享更多音视频相关内容!


发布于: 5 小时前阅读数: 6
用户头像

liuzhen007

关注

敲代码,搞开发。 2021.05.01 加入

本人深耕音视频技术,走全栈路线,前后端通吃,兼顾各端与流媒体服务器。 博客主页地址:https://liuzhen.blog.csdn.net 微信公众号:玩转音视频 欢迎交流学习!

评论

发布
暂无评论
FFmpeg[5] - 将视频文件转码成MP4格式(FFmpeg转封装2)