年会时抽奖中了一个极米投影仪,现在看片大多都使用投影仪来播放。我是开通了腾讯视频的会员,但是因为腾讯视频有 TV 版的缘故,其他版本没有给开放投屏功能。那么这就很尴尬了,TV 版会员太贵并且也没必要买,普通客户端不支持投屏并且缓存的资源也不是一个正常可以直接用其他播放器观看的格式。
通过查看客户端缓存的目录发现,视频是被切割为单个小的 ts 文件,也就是并没有做任何处理,只是一个切割操作而已。最重要的是切割的 ts 文件是有序的,文件名是以0,1,2,3,4这样的顺序命名的,所以只要想办法把文件按顺序合成就可以正常用其他播放器投屏观看了。
那么写个简单的 shell 脚本就可以实现这个操作(将ts文件按顺序合成为单文件)
最初尝试使用递归获取 .ts 文件并合并,这也是最简单的方式,但是由于直接使用 find . -name ‘*.ts’ 的结果是无序的,导致最终合成的视频顺序不正确
所以最终决定按以下最稳的方式实现
腾讯视频的缓存目录在:
~/Library/Containers/com.tencent.tenvideo/Data/Library/Application\ Support/Download/video/
video 目录下除了 ad 文件夹之外的所有文件夹都是已经缓存的视频,可以查看子文件夹中 .ts 文件的内容(可以空格键直接预览)然后确定具体是哪个视频的缓存资源
merge.sh b0025s0ph00.321004.hls ~/Downloads/合成视频1.mp4
#!/bin/bash
clear
cat << EOF
################### 腾讯视频(MacOS)缓存文件合成脚本 ###################
Author: eightpigs <[email protected]>
Date: 2018-04-14
EOF
echo -n "=> 准备数据... "
# 生成的目标文件
target=$2
# 源文件(.ts文件的目录)
source='/Users/'$USER'/Library/Containers/com.tencent.tenvideo/Data/Library/Application Support/Download/video/'$1'/'
# 使用时间戳来做临时目录
tmpDir='/tmp/merge_tencent/'`date +%s`'/'
mkdir -p $tmpDir
# 进入到视频的ts目录
cd "$source"
echo "完成"
echo -n "=> 合并文件夹... "
# 将文件递归移动到临时目录
for i in $(find ./ -name '*.ts');
do
cp -vf $i $tmpDir > /dev/null 2>&1;
done
echo "完成"
cd $tmpDir
echo -n "=> 获取需要合成文件数... "
# 总共有多少文件
# 因为ts 文件是有顺序的(文件名)
count=`ls -l $tmpDir |grep "^-"|wc -l | sed 's/[[:space:]]//g'`
echo "完成"
echo -n "=> 合成文件... "
# 按顺序合并
for ((i=0; i<$count; i ++))
do
cat "$tmpDir"$i'.ts'>>"$target"
done
echo "完成"
cat << EOF
结果:
文件数: $count
大小: `ls -lh $target | awk '{print $5}'`
路径:$target
######################################################################
EOF
rm -rf $tmpDir