android利用FFmpeg进行视频转换

大致思路:首先安装FFmpeg库到windows电脑上,先测试命令行工具是否可以使用(需要先配置环境),之后再试着将对应的android库集成到android程序中进行(也可以先集成到java程序中先试一下)。

一些命令:

# udp 广播推流(原始编码转为h264编码格式传输,并没有封装,所以只会有画面不会有声音,-re参数告诉FFmpeg根据实际的帧率和播放时间来处理输入文件,-re 为以流的方式读取)
#ffmpeg -re -i five.mp4 -vcodec copy -pkt_size 1300 -f h264 "udp://127.0.0.1:1234"
#拉流
#ffplay -f h264 "udp://127.0.0.1:1234" -fflags nobuffer -nofind_stream_info
#VLC:udp/h264://@127.0.0.1:1234


#音视频一块封装,以mpeg-ts格式封装。注:若在vlc中还以h264方式获取数据,还是没有声音,并且画面会花
#ffmpeg -re -i five.mp4 -vcodec copy -acodec copy -pkt_size 1300 -f mpegts udp://127.0.0.1:1234
#拉流
#ffplay -i udp://127.0.0.1:1234
#VLC:udp://@127.0.0.1:1234

        

#原始编码格式推流(虽然没有写音频参数,默认会一块儿封装),还是会卡顿
#ffmpeg -re -stream_loop -1 -i hu.mp4 -c copy -pkt_size 1300 -f mpegts udp://127.0.0.1:1234
#将udp视频流保存(容器格式为MP4,编码格式为h264,-c:v指定编码器)
#ffmpeg -i udp://127.0.0.1:1234 -c:v h264 output18.mp4

#进一步精简,删去某些参数,仍能够播放音视频。不卡顿,但分辨率下降
#ffmpeg -re -i hu.mp4 -pkt_size 1300 -f mpegts udp://127.0.0.1:1234

#ffmpeg -re -i five.mp4 -c copy -pkt_size 1300 -f mpegts udp://127.0.0.1:1234


#视频转编码格式,-c:v libvpx指定编码器    -b:v 1M视频比特率
#ffmpeg -i 4.mp4 -c:v libvpx -b:v 1M nj.webm
#ffmpeg -i output7.mp4 -c:v libx265 output100.mp4
# -f h264 编码格式(更详细)
#ffmpeg -i 4.mp4 -c:v libx264 -f h264 output.mp4


#-f 参数可以指定编码格式,容器格式

#查看某文件的编码格式及容器格式
#ffmpeg -i output.h264
#将某编码格式文件包装到某容器格式文件中
#ffmpeg -i output.h264 -c:v libx264 output.h264.mp4
#将某视频文件转码并且不封装    
#ffmpeg -i nj.webm -c:v libx264 -f h264 outputR.h264
#将MP4文件转化为mpegts封装格式的流文件
ffmpeg -i hu.mp4 -codec copy -bsf:v h264_mp4toannexb -f mpegts outputJLK.ts

  • 转化为流并推流:

ffmpeg -i hu.mp4 -c:v libx264 -pkt_size 1300 -f mpegts udp://127.0.0.1:1234
-c:v libx264 -preset veryfast -tune zerolatency 指定了编码器的参数,这些参数让编码器尽量减小延迟,以达到更好的实时性;
-an 告诉 FFmpeg 不要包含音频流
-f mpegts 指定了输出格式为 MPEG-TS;
udp://127.0.0.1:1234 指定了发送 UDP 数据包的目标地址和端口。

-preset veryfast -tune zerolatency -an                 //实验发现会卡顿,如果想有音频-an参数不要

-pkt_size 1300        //这个参数没有的话会导致vlc播放不了视频,不知道为什么

TS(Transport Stream)流和 PS(Program Stream)流是两种常见的音视频传输格式,它们在一些特性和应用场景上有所不同。
主要区别如下:
封装方式:TS 流采用了更加复杂的封装方式,可以同时封装多个音视频流和其他数据流。每个 TS 包固定大小为188字节,包含了包头和有效负载,有效负载中包含了音视频数据。而 PS 流则是将多媒体数据打包成一个整体,每个包有自己的帧头信息。
多路复用:TS 流支持高级别的多路复用,可以同时传输多个节目或流。每个节目或流都有其独立的 PID(Packet Identifier)来进行标识和分配。而 PS 流只能封装单个节目。
容错性:由于 TS 流采用了针对传输过程中的错误纠正和恢复的技术,因此具有较好的容错性,对于信号干扰或传输错误有一定的抵抗能力。相比之下,PS 流的容错性较差。
编辑和处理:由于 PS 流中每个包都有独立的帧头信息,这使得它对于编辑和处理操作更加方便,例如剪切、拼接等。而 TS 流则需要在包层级进行处理。
应用场景:TS 流常用于数字电视广播、IPTV、卫星传输等需要支持多路复用和实时传输的领域。而 PS 流主要应用于 DVD、蓝光光盘等存储介质中。
需要根据具体的应用场景和需求选择合适的流格式。对于实时传输和多路复用需求较高的情况,TS 流是一个更好的选择。而对于编辑和处理操作较多的情况,PS 流更加适用。



使用FFmpeg可以将视频文件转换为流数据,常见的有以下几种方式:
使用RTMP协议输出:通过FFmpeg的命令行工具,可以将视频文件通过RTMP协议推送到支持RTMP协议的服务器上,实现实时直播或点播。示例命令为:
ffmpeg -re -i input.mp4 -f flv rtmp://your-server-address

将视频提取为HLS流:使用FFmpeg将视频文件处理为HLS(HTTP Live Streaming)流,以便在网络上进行实时流媒体传输。HLS流数据可以在多个平台上播放,例如iOS和Android设备等。示例命令为:
ffmpeg -i input.mp4 -codec copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8该命令表示将 input.mp4 转换为 output.m3u8 和一系列ts流文件,hls_time参数表示每个ts流文件的长度,单位为秒。

将视频转换为MPEG-TS流:使用FFmpeg将视频文件转换为MPEG-TS(Transport Stream)格式的流数据。MPEG-TS是广播、电视等领域常用的传输协议,可支持高清视频和多声道音频。示例命令为:
ffmpeg -i input.mp4 -codec copy -bsf:v h264_mp4toannexb -f mpegts output.ts
该命令将 input.mp4 转换为 MPEG-TS 格式的流数据,并输出到 output.ts 文件中。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值