ffmpeg 視頻ts切片生成m3u8


下面幾種轉換方式是不同版本和方法

新版本ffmpeg轉視頻直接可以切邊並生成 m3u8(目前用的方式,也可以用選項 segment ):

ffmpeg -i '源文件.mp4' -c:v h264 -flags +cgop -g 30 -hls_time 20 -hls_list_size 0 -hls_segment_filename index%3d.ts 'index.m3u8'

好像非 MP4 文件也可以直接切分,試了下 mkv、avi等,不太懂之后在研究,先使用就行。

或者這個:

ffmpeg -i input.mp4 -vcodec copy -acodec copy -hls_time 60 -hls_list_size 0 index.m3u8

 

一、方法一

1、首先將視頻文件轉為視頻編碼h264,音頻編碼aac格式的mp4文件

使用ffprobe查看文件編碼方式

ffprobe input.mkv

如果音視頻編碼為h264/aac則執行

ffmpeg -i input.mkv -acodec copy -vcodec copy out.mp4

否則執行

ffmpeg -i input.mkv -acodec libfaac -vcodec libx264 out.mp4

2、將mp4文件轉為ts文件並生成m3u8

1. 將mp4轉為完整的ts

ffmpeg -i out.mp4 -c copy -bsf h264_mp4toannexb output.ts

如果不使用 -bsf h264_mp4toannexb 參數會提示錯誤,主要是因為使用了mp4中的h264編碼 而h264有兩種封裝:

一種是annexb模式,傳統模式有statrtcode SPS和PPS是在ES中。

另一種是mp4模式,一般mp4 mkv avi會沒有startcode SPS和PPS以及其他信息被封裝在container中 每一個frame前面是這個frame的長度,

很多解碼器只支持 annexb 這種模式,因此需要將mp4做轉換,在ffmpeg中用 h264_mp4toannexb_filter 可以做轉換,所以需要使用 -bsf h264_mp4toannexb 來進行轉換。

2. 將ts切片,並生成m3u8文件

ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts

二、方法二

1.ffmpeg切片命令,以H264和AAC的形式對視頻進行輸出

ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls output.m3u8

注:-strict -2 之前是實驗參數表示 aac音頻編碼,如果不使用aac音頻編碼使用使其的編碼好像還需要導入第三方的音頻編碼庫,使用FFmpeg自帶的aac音頻編碼帶上-strict -2 參數就可以了。

2.ffmpeg轉化成HLS時附帶的指令 

  • -hls_time n: 設置每片的長度,默認值為2。單位為秒
  • -hls_list_size n:設置播放列表保存的最多條目,設置為0會保存有所片信息,默認值為5
  • -hls_wrap n:設置多少片之后開始覆蓋,如果設置為0則不會覆蓋,默認值為0.這個選項能夠避免在磁盤上存儲過多的片,而且能夠限制寫入磁盤的最多的片的數量
  • -hls_start_number n:設置播放列表中sequence number的值為number,默認值為0

3.對ffmpeg切片指令的使用

ffmpeg -i output.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 output1.m3u8

三、方法三

1、看看原視頻是不是MP4啦 如果不是就需要轉成MP4一下咯  

ffmpeg -i 源文件 -y -c:v libx264 -strict -2 \home\xxx.mp4

2、把MP4轉成ts文件

ffmpeg -y -i \home\xxx.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb \home\xxx.ts

3、切分ts文件

ffmpeg -i \home\xxx.ts -c copy -map 0 -f segment -segment_list \home\xxx\index.m3u8 -segment_time 30 \home\xxx\nxb-%04d.ts
  • -segment_list 指定 m3u8 文件
  • -segment_time 30 指定切片ts文件長度30秒

如果是MP4文件,直接執行

ffmpeg -i xxx.mp4 -f segment -segment_time 60 -segment_format mpegts -segment_list /home/xxx/video_name.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 /home/xxx/course-%04d.ts

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM