使用youtube-dl下载Periscope视频后用ffmpeg转换出错,求解决方案
解决Periscope视频下载转码后无法播放/跳转的问题
我来帮你搞定这个问题——Periscope的直播回放视频经常因为流媒体的分段结构特性,导致下载或转码后出现索引异常、兼容性差的问题,咱们一步步排查解决:
1. 先确认原始下载文件是否有问题
首先别着急转码,先检查youtube-dl下载的gg.mp4本身:
- 在VLC里打开它,试试能不能正常跳转。如果原始文件就跳不动,那问题出在下载环节,不是转码的锅。
- 用ffmpeg查看文件的详细流信息,看看有没有异常:
重点看输出里的封装格式、流编码,要是出现ffmpeg -i gg.mp4Invalid data found when processing input或者封装格式显示不是标准MP4(比如FLV),那就是下载的源文件本身有问题。
2. 优化youtube-dl的下载参数,拿到标准源文件
Periscope的视频大多是HLS分段流,youtube-dl默认的合并方式可能会丢失索引,试试这些参数:
- 用原生HLS下载器处理分段,避免合并错误:
youtube-dl -v --hls-prefer-native periscopeurl - 直接指定下载标准MP4封装的最佳质量流,减少后续转码的兼容性问题:
youtube-dl -v -f bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4] periscopeurl
3. 调整ffmpeg转码命令,修复索引与兼容性
如果原始文件本身没问题,那转码时需要强制重建索引,并生成播放器友好的MP4格式:
基础修复命令(解决跳转问题)
添加-movflags +faststart参数,把MP4的索引信息(moov atom)移到文件开头,让播放器能快速加载索引,支持跳转:
ffmpeg -i gg.mp4 -c:v libx264 -preset veryslow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p -movflags +faststart gg2.mp4
进阶优化(针对关键帧间隔过大的情况)
要是视频关键帧间隔太长,跳转时播放器找不到定位点,可以强制设置合理的关键帧间隔(比如30fps视频每60帧一个关键帧,也就是2秒):
ffmpeg -i gg.mp4 -c:v libx264 -preset veryslow -crf 18 -g 60 -c:a aac -b:a 192k -pix_fmt yuv420p -movflags +faststart gg2.mp4
4. 验证转码结果
转码完成后,再用ffmpeg -i gg2.mp4检查输出,确认:
- 封装格式是
ISO Media, MP4 v2 [ISO 14496-14] - 视频流编码是
H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 - 音频流编码是
AAC (Advanced Audio Coding)
之后先在VLC测试跳转,再用K-Lite的Media Player Classic测试播放,标准MP4格式对K-Lite的兼容性很好,应该能正常播放。
5. 备选方案:直接用ffmpeg下载+转码一步完成
如果youtube-dl的下载总是有问题,跳过它直接用ffmpeg抓取HLS流:
- 先用youtube-dl获取Periscope的HLS流地址:
youtube-dl -g periscopeurl - 把输出的第一个URL(一般是
.m3u8格式)填入ffmpeg命令,直接下载并转码:ffmpeg -i "这里填HLS流URL" -c:v libx264 -preset veryslow -crf 18 -c:a aac -b:a 192k -pix_fmt yuv420p -movflags +faststart gg_final.mp4
内容的提问来源于stack exchange,提问作者Furkan Gözükara




